運(yùn)行時(shí)多態(tài)
重寫override
重寫方法
沒有重寫的方法會(huì)被重寫
沒有重寫的方法中調(diào)用已經(jīng)重寫的方法會(huì)調(diào)用重寫后的新方法而不是父類中的舊方法
把指針的聲明類型Rectangle改成Shape也不會(huì)有任何影響,因?yàn)槁暶黝愋筒恢匾匾氖侵羔槍?shí)際指向的類型
屬性也可以重寫,但本質(zhì)上屬性背后的訪問器方法被override
重載
方法名相同,參數(shù)不同不可以共存
方法名(參數(shù)名)不同,參數(shù)相同可以共存
因此OC不支持方法重載
super僅指父類(Shape),沒有多態(tài)性
相比之下,self有多態(tài)性,可以指向不同子類,即在不同的子類(Circle,Rectangle)中會(huì)調(diào)用各個(gè)子類的方法
內(nèi)存模型
rect-》Rectangle Class(類)-》methodList-》各種方法(draw,print)
因此,多態(tài)調(diào)用涉及地址的動(dòng)態(tài)辨析,但這種模式的代價(jià)是效率較低
繼承中的初始化器和析構(gòu)器
子類自動(dòng)繼承基類的初始化器
子類也可以重寫基類的初始化器(如Shape重寫了NSObject的初始化器,而Rectangle則重寫了?Shape的初始化器)但此時(shí)必須手動(dòng)調(diào)用基類的初始化器self=[super init];
析構(gòu)器也可以繼承或重寫,子類析構(gòu)器運(yùn)行后會(huì)自動(dòng)后置調(diào)用基類析構(gòu)器,同時(shí)不可以手動(dòng)調(diào)用
子類析構(gòu)器也具有多態(tài)性
注意:避免在父類的init或dealloc中調(diào)用子類重寫的方法,否則子類重寫的init在繼承基類的init時(shí)調(diào)用的是子類中重寫后的方法,而重寫后的方法中可能包含尚未在子類init中初始化的實(shí)例變量。而dealloc中也不要調(diào)用子類的方法,因?yàn)樽宇愐呀?jīng)被釋放