OC之繼承與便利構造器

1. 繼承

繼承注意事項

  1. 子類繼承父類所有變量和方法;
  2. 繼承是單向的, 子類所有成員變量和方法
  3. 沒有父類的類稱為根類, OC中的根類為NSObject
  4. 如果子類不滿意父類的方法的實現(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那步驟; 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 從畢業(yè)至今,我還是那個社交圈很單純的馬老師。沒想到同學起的外號到如今成了事實,生活圈子還是單調如一,接觸的人也是十...
    Dara_馮閱讀 716評論 0 0
  • 中國男足多年來帶給國人太多的遺憾和失落,但足球不止是男人的世界,作為球迷,在欣賞精彩比賽的同時,賽場內外的...
    伊菡聊球閱讀 1,233評論 0 1

友情鏈接更多精彩內容