一.繼承:
子類(lèi)可以直接復(fù)用父類(lèi)中的成員.子類(lèi)繼承父類(lèi)所有方法的聲明和實(shí)現(xiàn) 非私有的實(shí)例變量以及協(xié)議 繼承時(shí)要在.h中聲明一下 繼承具有單根性和傳遞性
繼承的根類(lèi):大多都繼承自 NSObject 類(lèi),所以在定義一個(gè)類(lèi)時(shí),要繼承NSObject 類(lèi)。
繼承就是代碼優(yōu)化公共部分交給父類(lèi)
例如:
(Person是父類(lèi)Worker 和Worker都繼承了Person成為子類(lèi))(注:oc中的所有類(lèi)都繼承與NSObject)
#import "Person.h"
@interface Worker : Person
@end
#import "Person.h"
@interface Worker : Person
@end
二.繼承的特點(diǎn):
- 使用繼承可以實(shí)現(xiàn)代碼的復(fù)用,減少代碼冗余;
- Objective-C中一個(gè)類(lèi)可以繼承另一個(gè)類(lèi);
- 被繼承的類(lèi)稱(chēng)為父類(lèi)或超類(lèi)(基類(lèi));
- 繼承的類(lèi)稱(chēng)為子類(lèi)或派生類(lèi);(孩子類(lèi));
- 子類(lèi)可以直接擁有父類(lèi)中所有允許子類(lèi)繼承的屬性和方法;
- (繼承關(guān)系是可以傳遞的)子類(lèi)除了可以調(diào)用父類(lèi)的方法,也可以調(diào)用父類(lèi)的父類(lèi)的方法,也就是說(shuō)繼承可以確保某個(gè)父類(lèi)型之下的所有類(lèi)都會(huì)有父類(lèi)型所持有的全部方法;
- 子類(lèi)可以有自己的成員變、量屬性和方法;
- (單一繼承性)Objective-C不支持多重繼承。
三.繼承的作用:
繼承的標(biāo)識(shí)為英文的“:”冒號(hào)(),使用繼承可以定義一個(gè)具有父類(lèi)所有功能(成員和方法)的新類(lèi),它繼承了父類(lèi)的功能。
四.繼承中的方法重寫(xiě):
- 編寫(xiě)子類(lèi)時(shí),某些方法(從父類(lèi)繼承過(guò)來(lái))需要自己的代碼實(shí)現(xiàn);
- 子類(lèi)允許重寫(xiě)父類(lèi)的方法,在調(diào)用子類(lèi)對(duì)象的重寫(xiě)方法時(shí),就會(huì)調(diào)用重寫(xiě)后的方法;
- 父類(lèi)中被子類(lèi)所重寫(xiě)的方法則在調(diào)用子類(lèi)方法時(shí)被忽略;
五.super關(guān)鍵字:
- 如果在子類(lèi)中 需要調(diào)用父類(lèi)的功能,可以借助super關(guān)鍵字;
- 子類(lèi)中使用super發(fā)送消息時(shí),實(shí)際上是告訴子類(lèi)調(diào)用父類(lèi)的方法;
- 如果父類(lèi)沒(méi)有定義該方法,則繼續(xù)在繼承鏈上查找,直到找到為止;
- 如果查到NSobject為止仍然未找到,則報(bào)錯(cuò);
- 重寫(xiě)方法時(shí)經(jīng)常會(huì)使用super關(guān)鍵字調(diào)用父類(lèi)的方法。
六.為何要使用繼承?
將所有重復(fù)的內(nèi)容合并在一起,可以使代碼有效率,簡(jiǎn)潔,才意味著是一個(gè)成功的架構(gòu)。否則,修改代碼時(shí)需要修改多處,就很容易出錯(cuò)。
七.繼承使用注意:
- 父類(lèi)要寫(xiě)在子類(lèi)前面
- OC中不允許子類(lèi)中擁有和父類(lèi)中相同名稱(chēng)的成員變量
- OC中子類(lèi)可以重寫(xiě)父類(lèi)方法,當(dāng)調(diào)用子類(lèi)時(shí)優(yōu)先調(diào)用子類(lèi)方法
- 繼承造成類(lèi)與類(lèi)之間耦合性太強(qiáng),若父類(lèi)不見(jiàn),則子類(lèi)不能使用
- 父類(lèi)類(lèi)型的變量不能用來(lái)調(diào)用子類(lèi)的方法
八.繼承中方法調(diào)用的流程:
首先到子類(lèi)去找,如果有該方法,就調(diào)用子類(lèi)方法,如果沒(méi)有,就再到父類(lèi)去找,如果父類(lèi)還沒(méi)有,再到父類(lèi)的父類(lèi)去找,如果最后還沒(méi)有找到,程序會(huì)崩潰。