1. 继承
继承注意事项
- 子类继承父类所有变量和方法;
- 继承是单向的, 子类所有成员变量和方法
- 没有父类的类称为根类, OC中的根类为NSObject
- 如果子类不满意父类的方法的实现, 可以重写父类方法
// 注意: 当某一类的定义的对象调用方法的时候, 会在自己类的.m文件中查找, 要是没有则回到父类的方法中查找, 若找到, 则执行自己的方法
- 建立student文件的时候, 继承于Person, Student的 .h文件 会显示继承与Person;
如
@interface Student : Person // student 是子类, Person是父类, (子类和父类是相对的) @end
若是新建的新类, 都继承于NSObject
@interface Person : NSObject @end
2. 初始化方法
关键词 super 是编译器指令, 并非对象
作用: 给super发消息, 可执行父类中实现的方法
子类可以重写父类的方法, 即: 子类既有自己的实现, 又有父类继承下来的实现, 如果想使用父类的实现, 向super发送消息.
super用法! 例如还拿Person类举例, 其中有info方法
- (void)info {
NSLog(@"%@, %@, %u", _name, _sex, _age);
}
Student 类继承与Person 其中的info方法
- (void) info{
NSLog(@"name %@, age %lu, sex %@, school:%@, number: %lu ", _name, _age, _sex, _school, _number);
[super info]; // 执行到这的时候, 会执行父类的info方法, 相当于同时执行了父类的info了子类的info方法
NSLog(@"school: %@", number: %@", _school, _number);
}
当子类执行info 方法的时候,会相应执行父类info方法!
3.初始化
初始化的主要作用是: 为某些实例变量赋初始值!
初始化方法子啊对象的整个生命周期只使用一次;
- (id)init{
self = [super init]; // 给父类发送init消息, 即执行父类中实现的init方法;
if (self) {
// 初始化设置
}
return self;
}
例如: 定义一个Person类
.h文件
- (id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age;
.m文件中实现
- (id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
{ self = [super init]; // 调用父类中init方法, 即 NSObject中得init方法;
if(self){
[self setName:name]; 或 // _name = name;
[self setAge:age]; 或 // _sex = sex;
[self setSex:sex]; 或 // _age = age;
}
return self;
}
若建立一个类Student作为Person的子类, 则Student的初始化方法为
Student的 .h 文件
@interface Student : Person
{
NSString *_school;
NSInteger _number;
}
- (id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
school:(NSString *)school
number:(NSInteger)number;
@end
Student 中的.m文件
- (id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
school:(NSString *)school
number:(NSInteger)number
{
self = [super initWithName:name sex:sex age:age];
if (self) {
[self setSchool: school];
[self setNumber: number];
}
return self
}
self = [super initWithName:name sex:sex age:age];
从父类那里继承初始化方法, 对name, sex, age赋值!
使用初始化方法
Student *S1 =[[Student alloc] initWithName: @"zhangsan" sex:@"man" age:12 school:@"yizhong" number:12 ]; // 直接赋值完成
4. 便利构造器
遍历构造器在初始化方法的基础上那个前进了一步, 封装了对象, 创建过程, 内部实现: 封装alloc 和初始化方法, 使用更加简洁.
如: 上边的Student类 的便利构造器如下:
.h 文件的声明
+ (id)studentWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
school:(NSString *)school
number:(NSInteger)number; // 需要对所有你要赋值的对象使用;
.m文件中方法的实现
+ (id)studentWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
school:(NSString *)school
number:(NSInteger)number
{
Student *stu = [[Student alloc] initWithName:name sex:sex age:age school:school number:number];
// 把初始化方法的封装了起来 所以, 要用便利构造器, 之前得写好初始化方法
return stu;
}
使用:
Student *S1 = [ Student studentWithName: @"zhangsan" sex:@"man" age:12 school:@"一中" number:20];
赋值完毕; 少了alloc那步骤;