/* 继承 */
1. 子类继承父类所有的成员变量, 属性和方法
2. OC中无多继承 如果实现多继承可以用协议来实现
3. 子类可以重写父类方法, 在子类.h里不需要再次写声明
4. 子类如果继承父类, 那么在子类的初始化方法内部必须调用父类的初始化方法
5. 子类可以强转为父类, 但是父类不能强转子类
- (instancetype)init
{
self = [super init]; //[super init] 子类对象调用父类方法, super : 子类对象
if (self) {
}
return self;
}
// 建立Person类
Person.h
{
NSString *_name;
NSString *_sex;
NSInteger _age;
}
-(void)eat;
Person.m
-(void)eat
{
NSLog(@"吃食物");
NSLog(@"self = %@", self);
//哪一个对象去调用一个实例化方法, 那么在这个实例化方法中的self, super就是这个对象本身, 无论这个方法是自己的还是父类的方法, 谁调用就是谁!
}
//建立Student类继承Person类
Student.h
#import <Foundation/Foundation.h>
#import"Person.h"
@interface Student : Person
#import "Student.h"
@implementation Student
// 重写父类方法
-(void)eat
{
//子类对象调用父类方法 super: 子类对象
[super eat];
}
- (instancetype)init
{
self = [super init];
if (self) {
}
return self;
}
/* 指派初始化 */
1. 指派初始化用于纠错
2.指派初始化的默认值在.h里面写默认的声明 default
例题:Person类初始化必须有性别, 默认成员变量sex为"female", 写它的指派初始化
Person.h
{
NSString *_name;
NSString *_sex; //default is female (声明默认值)
NSInteger _age;
}
Person.m
// 作为默认值
-(instancetype)init
{
self = [self initWithSex:@"female"];
return self;
}
//指派初始化
-(instancetype)initWithSex:(NSString *)sex
{
self = [super init]; // 谁写[super init], 谁就是指派初始化
if(self){
_sex = sex;
}
return self;
}
//给姓名和性别初始化
-(instancetype)initWithName:(NSString *)name sex:(NSString *)sex
{
self = [self initWithSex:sex];
if (self){
_name = name;
}
return self;
}
//给年龄和性别初始化
-(instancetype)initWithAge:(NSInteger)age sex:(NSString *)sex
{
self = [self initWithSex:sex];
if (self){
_age = age;
}
return self;
}
//给年龄和名字初始化
-(instancetype)initWithAge:(NSInteger)age name:(NSString *)name
{
self = [self init];
if(self){
_name = name;
_age = age;
}
return self;
}
//给三个成员变量都初始化
-(instancetype)initWithAge:(NSInteger)age name:(NSString *)name sex:(NSString *)sex
{
self = [self initWithSex:sex];
if (self){
_age = age;
_name = name;
}
return self;
}
//只给年龄初始化
-(instancetype)initWithAge:(NSInteger)age
{
self = [self init];
if (self){
_age = age;
}
return self;
}
//只给名字初始化
-(instancetype)initWithName:(NSString *)name
{
self = [self init];
if (self){
_name = name;
}
return self;
}
/* 类目 */
1. 是用于分类使用, 将一个类的不同功能的方法进行不同的分类, 给一个类进行扩展, 添加方法和属性
2. 类目里面禁止写成员变量!
3. 类目可以写属性, 但是实现很麻烦,一般都不写属性,只在类目中创建方法!
//创建类目
command + n 选择 Objective-C File
File Type : Category
Class : 选择想要添加方法的类
/* 延展 */
1. 主要是给类添加私有的变量和私有方法
2. 只能在类内部使用, 外界是用不了的!
3. 在.m @implementation上面写你@interface ClassName()...@end
4. 成员变量, 属性和方法都可以写
/* 协议 */
1. 协议是一堆公共方法名的集合
2. 协议只声明方法, 谁遵循这个协议,谁就实现协议中的方法, 这个方法属于这个类, 只能是这个类的对象来调用!!
3. 只有协议 被引用是在.h里面写 #import 其他的都写@class
command + n 选择 Objective-C File
File Type : Protocol
例题:
1.MyProtocol
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
//协议方法
-(void)eat;
2. 创建Girl类
#import <Foundation/Foundation.h>
#import "MyProtocol.h" //引入协议.h
@interface Girl : NSObject
@property(nonatomic, assign)id<MyProtocol> delegate; //定义一个代理人属性
-(void)hungry;
Girl.m
-(void)hungry
{
//让它的代理去执行协议方法
[self.delegate eat];
}
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface Boy : NSObject <MyProtocol>
Boy.m
-(void)eat
{
NSLog(@"你饿了, 我帮你吃");
}
main.m
#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Girl *girl = [[Girl alloc]init];
girl.delegate = [[Boy alloc]init]; // 设置代理人
[girl hungry];
}
return 0;
}