繼承、多態、類別 學習目標 1、繼承的含義 2、父類子類的別稱 3、欄位和消息的繼承 4、重寫和重寫消息的調用 5、多態 6、類別(Category) 1.需要理解的知識 面向對象的三個基本特征: 1、封裝 2、繼承 3、多態 1、繼承(單繼承): 父類(超類)和子類的關係。 繼承的兩個類,存在父子 ...
繼承、多態、類別
學習目標
1、繼承的含義
2、父類子類的別稱
3、欄位和消息的繼承
4、重寫和重寫消息的調用
5、多態
6、類別(Category)
=============================================
1.需要理解的知識
面向對象的三個基本特征: 1、封裝 2、繼承 3、多態
1、繼承(單繼承): 父類(超類)和子類的關係。
繼承的兩個類,存在父子關係。
OC支持單繼承,不支持多繼承。
1.1 生活中的繼承
人(父類) —— 男人/女人(子類)
男人/女人(父類) ——— 學生(子類)
學生(父類)——— 大學生(子類)
大學生(父類) ——— 大四學生(子類)
大四學生(父類)——— 小明(子類)
【註】
(1)把繼承又叫做派生
父類的屬性(成員變數(不包括私有))和方法,子類可以直接獲取,這個過程就叫做繼承
子類在父類的基礎上,創建了自己獨有的成員變數和方法,這個過程就叫做派生。
繼承和派生其實是說的繼承概念的不同的側重點。
(2)提示:每個類中都有一個super class指針,該指針指向自己的父類。對象中有一個isa指針,該指針指向調用該對象的類。
繼承的好處:
1)創建大量的相似類的時候,可以節省工作量。抽取出了重覆的代碼
2)使用框架中的類,或已經寫好的類,繼承該類,生成一個派生類,比原類更好用。
註意:NSString、NSArray、NSDictionary都是不能夠繼承的。
3)建立了類和類之間的聯繫
繼承的缺點:
耦合性太強
NSString不能被繼承的原因:
NSString這個類在設計的時候採用了“抽象工廠”模式,內部是個class cluster,一個類簇。也就是說NSString是個“工廠類”,然後它在外層提供了很多方法介面,但是這些方法的實現是由具體的內部類來實現的。當使用NSString生成一個對象時,初始化方法會判斷哪個“自己內部的類”最適合生成這個對象,然後這個“工廠”就會生成這個具體的類對象返回給你。這種又外層類提供統一抽象的介面,然後具體實現讓隱藏的,具體的內部類來實現。
1.2 代碼中的繼承
<1>繼承的基本語法
(1)@interface 子類名:父類名
@end
(2)繼承之後
子類可以使用父類的所有共有方法
子類可以獲得父類非私有的成員變數
<2>重寫
1.子類從父類繼承的方法, 有時候不適合子類,子類可以重寫這個方法
2.重寫就是重新實現一遍父類的方法(方法名一樣 ,實現內容不同)
3.子類重寫父類方法之後,子類對象最終執行的是子類重寫之後的方法 。
1.3 繼承在記憶體中的體現
子類繼承父類之後。 子類對象的構成:
1) 父類的欄位和方法
2) 子類自己獨有的欄位和方法
【繼承的作用】
1、快速創建多個形似的類
2、對類進行擴展
3、自定義一些系統的一些功能控制項(UI裡面用的比較多)
【重寫】有時候從父類繼承到的方法,並不適合子類,子類可以重寫這個方法。
【重寫是多態的一種,多態就是同一個聲明不同的實現】
【註】很多時候,子類的方法只需要在父類的同名方法中增補些內容。可以通過關鍵字【supper】調用父類的方法,再增添子類獨有的內容。
1.4 關鍵字super
Super關鍵字,在子類中重寫方法時,可以讓調用者跳過這一層而調用父類中的方法。
作用:
(1)直接調用父類中的某一個方法
(2)Super處在對象方法中,那麼就會調用父類的對象方法;super處於類方法中,那麼就會調用父類的類方法。
使用場景:子類在重寫父類方法時,想要保留父類的一些行為。
1.5 繼承和組合
繼承的適用場合:
(1)當兩個類擁有相同的屬性和方法時,就可以將相同的屬性和方法抽取到一個父類中。
(2)當A類完全擁有B類中的部分屬性和方法時,可以考慮讓B類繼承A類(考慮),在這種情況下,也可以考慮使用組合。
繼承:###是xxx,如狗是動物,可以讓狗繼承動物類
組合:###擁有xxx,如學生有書,可以讓書這個類作為學生類的屬性
———————————————————
2、多態與類的消息機制
【多態】重寫、虛函數
//其實多態就是指,同一個介面不同的實現
同一個方法,不同的實現,稱為多態。重寫是多態的一種。
方法重載也是多態的一種。方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數的類型或參數的個數。
【註意】OC沒有嚴格的方法重載。
【虛方法】
虛函數定義:調用方法時,不看指針,看對象,對象的地址指向什麼對象,就調用什麼方法,稱為虛方法。
虛方法的好處:可以描述不同事物被相同事件觸發,產生不同的響應(結果)
1.響應消息,不看指針,看對象。
2.父類的指針,可以指向子類的對象(子類的對象賦值給父類)。
【註】
虛方法體現了不同事物被同一事件觸發,有不同的響應。
給不同對象發送相同的消息,反應不一樣。
實現多態(滿足三個條件)
1、有繼承關係
2、有重寫
3、父類的指針指向了子類的對象
【註】NSString NSArray NSDictionary NSNumber 都是【工廠類】或者是抽象類,不能被繼承,即使被繼承,也不能使用父類的方法。
———————————————————
5、類別/類目 category
類別的寫法:
@interface 類名 (類別名)
定義方法
@end
如何給一個類擴展方法?
1、繼承
2、類別
註:一旦使用類別給已有的類增補方法,那麼這個類的對象就可以使用這個方法
<2>.類別功能:
1. 可以給已有/ 系統原生的類增加方法,不能添加全局變數和屬性。
2.可以對類的方法進行分類管理,可以將類的實現分散到多個不同文件或多個不同框架中。
<3>使用類別需要註意的問題
1.類別中不能添加成員變數
2.使用類別增加的方法須導入類別頭文件
3.父類類別中的方法,子類也可以用
<4>類擴展
當不想對外公開一些類的方法時,我們可以使用類擴展
1.類擴展的基本語法
在.m文件中
@interface Person()//沒有名字
- (void)song;
@end
@implementation Person
- (void)song{
}
@end
註: 類擴展中的聲明和實現都放在.m文件中
2.類擴展的功能
1.可以實現私有方法
2.可以聲明成員變數 ,成員變數是私有的,子類和其他類訪問不了。