一、 封裝
封裝的好處:
- 過濾不合理的值
- 屏蔽內(nèi)部的賦值過程
- 讓外界不必關(guān)注內(nèi)部的細(xì)節(jié)
二、繼承
繼承的好處:
- 不改變原來模型的基礎(chǔ)上,拓充方法
- 建立了類與類之間的聯(lián)系
- 抽取了公共代碼
繼承的壞處:耦合性強(qiáng)(當(dāng)去掉一個父類,子類將不能再使用)
繼承的注意點:
- 子類和父類不能有相同的成員變量
- 子類可以重寫父類的方法
- 子類方法和屬性的訪問過程:如果子類沒有,就去訪問父類的
三、組合
//繼承和組合:
@interface Score : NSObject {
int _cScore;
int _ocScore;
}
@end
@implementation Score
@end
@interface Student : NSObject {
Score *_socre; // 這里用到組合,因為不能說成績是個學(xué)生
int _age;
}
@end
@implementation Student
@end
組合和繼承的理解:
- 繼承是 xxx 是 xxx
- 組合是 xxx 擁有 xxx
四、多態(tài)
多態(tài):不同的對象已自己的方式響應(yīng)相同名稱方法的能力稱為多態(tài)
態(tài)簡單的說就是:父類指針指向子類對象
多態(tài)的好處:用父類接收參數(shù),節(jié)省代碼
#import <Foundation/Foundation.h>
@interface Animal : NSObject
@end
@implementation Animal
- (void)eat {
NSLog(@"Animal----eat food");
}
@end
@interface Dog : Animal
@end
@implementation Dog
- (void)eat {
NSLog(@"Dog----eat food");
}
@end
@interface Cat : Animal
@end
@implementation Cat
- (void)eat {
NSLog(@"Cat----eat food");
}
@end
// 參數(shù)中使用的父類類型,可以傳入子類、父類對象
void feed(Animal *a) {
[a eat];
}
// 這個函數(shù)體現(xiàn)了多態(tài)的好處,節(jié)省了代碼
int main()
{
Animal *aa = [[Animal alloc] init];
feed(aa);
Dog *dd = [[Dog alloc] init];
feed(dd);
Cat *cc = [[Cat alloc] init];
feed(cc);
}
多態(tài)的局限性:父類類型的變量 不能 直接調(diào)用子類的特有方法 (要用到強(qiáng)制轉(zhuǎn)換)
// 強(qiáng)制轉(zhuǎn)換
Person *p = [[Student alloc] init];
// 假如學(xué)習(xí)是學(xué)生特有的方法,如果想調(diào)用需要強(qiáng)制轉(zhuǎn)換
// OC是弱語法如果用[p study]也可以(是動態(tài)綁定),但由于編譯器會出現(xiàn)警告,所以不要這么寫用強(qiáng)制轉(zhuǎn)換 讓其更合理
Student *s = (Student *)p;
[s study];
動態(tài)綁定:在運(yùn)行時根據(jù)對象的類型確定動態(tài)調(diào)用的方法
五、分類-Category
分類的作用:在不改變原來類內(nèi)容的基礎(chǔ)上,可以為類增加一些方法 (便于合作開發(fā))
分類的使用注意:
- 分類只能增加方法,不能增加成員變量
- 分類方法實現(xiàn)中可以訪問原來類中的聲明的成員變量
- 分類可以重新實現(xiàn)原來類中的方法,但會覆蓋掉原來類中的方法 ,會導(dǎo)致原來的方法不能使用(所以一般不會在分類中重現(xiàn)實現(xiàn)原來類中的方法)
- 方法調(diào)用的優(yōu)先級:分類(最后參與編譯的分類優(yōu)先)---> 原來類 ---> 父類