標籤:
封裝的好處:
- 過濾不合理的值
- 屏蔽內部的賦值過程
- 讓外界不必關注內部的細節
繼承的好處:
不改變原來模型的基礎上,拓充方法
建立了類與類之間的聯絡
抽取了公用代碼
壞處:耦合性強(當去掉一個父類,子類將不能再使用)
繼承的注意點:
- 子類和父類不能有相同的成員變數
- 子類可以重寫父類的方法
- 子類方法和屬性的訪問過程:如果子類沒有,就去訪問父類的
繼承和組合:
1 @interface Score : NSObject 2 { 3 int _cScore; 4 int _ocScore; 5 } 6 @end 7 8 @implementation Score 9 @end10 11 @interface Student : NSObject12 {13 Score *_socre; // 這裡用到組合,因為不能說成績是個學生14 int _age; 15 }16 @end17 18 @implementation Student19 @end
組合和繼承可以這樣理解:
- 繼承是 xxx 是 xxx
- 組合是 xxx 擁有 xxx
多態簡單的說就是:父類指標指向子類對象
多態的好處:
#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// 參數中使用的父類類型,可以傳入子類、父類對象void feed(Animal *a){ [a eat];}// 這個函數體現了多態的好處,節省了代碼int main(){ Animal *aa = [[Animal alloc] init]; feed(aa); Dog *dd = [[Dog alloc] init]; feed(dd); Cat *cc = [[Cat alloc] init]; feed(cc);}
多態的局限性:
- 父類類型的變數 不能 直接調用子類的特有方法 (要用到強制轉換)
// 強制轉換Person *p = [[Student alloc] init];// 假如學習是學生特有的方法,如果想調用需要強制轉換// OC是弱文法如果用[p study]也可以(是動態綁定),但由於編譯器會出現警告,所以不要這麼寫用強制轉換 讓其更合理Student *s = (Student *)p;[s study];
- 動態綁定:在運行時根據對象的類型確定動態調用的方法
Objective-C中的封裝、繼承、多態