1. 繼承
繼承注意事項
- 子類繼承父類所有變量和方法;
- 繼承是單向的, 子類所有成員變量和方法
- 沒有父類的類稱為根類, OC中的根類為NSObject
- 如果子類不滿意父類的方法的實現(xiàn), 可以重寫父類方法
// 注意: 當某一類的定義的對象調用方法的時候, 會在自己類的.m文件中查找, 要是沒有則回到父類的方法中查找, 若找到, 則執(zhí)行自己的方法
- 建立student文件的時候, 繼承于Person, Student的 .h文件 會顯示繼承與Person;
如
@interface Student : Person // student 是子類, Person是父類, (子類和父類是相對的) @end
若是新建的新類, 都繼承于NSObject
@interface Person : NSObject @end
2. 初始化方法
關鍵詞 super 是編譯器指令, 并非對象
作用: 給super發(fā)消息, 可執(zhí)行父類中實現(xiàn)的方法
子類可以重寫父類的方法, 即: 子類既有自己的實現(xiàn), 又有父類繼承下來的實現(xiàn), 如果想使用父類的實現(xiàn), 向super發(fā)送消息.
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]; // 執(zhí)行到這的時候, 會執(zhí)行父類的info方法, 相當于同時執(zhí)行了父類的info了子類的info方法
NSLog(@"school: %@", number: %@", _school, _number);
}
當子類執(zhí)行info 方法的時候,會相應執(zhí)行父類info方法!
3.初始化
初始化的主要作用是: 為某些實例變量賦初始值!
初始化方法子啊對象的整個生命周期只使用一次;
- (id)init{
self = [super init]; // 給父類發(fā)送init消息, 即執(zhí)行父類中實現(xiàn)的init方法;
if (self) {
// 初始化設置
}
return self;
}
例如: 定義一個Person類
.h文件
- (id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age;
.m文件中實現(xiàn)
- (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. 便利構造器
遍歷構造器在初始化方法的基礎上那個前進了一步, 封裝了對象, 創(chuàng)建過程, 內部實現(xiàn): 封裝alloc 和初始化方法, 使用更加簡潔.
如: 上邊的Student類 的便利構造器如下:
.h 文件的聲明
+ (id)studentWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
school:(NSString *)school
number:(NSInteger)number; // 需要對所有你要賦值的對象使用;
.m文件中方法的實現(xiàn)
+ (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那步驟;