OC面向?qū)ο蟆鄳B(tài)

OC面向?qū)ο蟆鄳B(tài)

OC面向?qū)ο蟆鄳B(tài)

OC面向?qū)ο蟆鄳B(tài)

一、基本概念

多態(tài)在代碼中的體現(xiàn),即為多種形態(tài),必須要有繼承,沒有繼承就沒有多態(tài)。

在使用多態(tài)是,會進行動態(tài)檢測,以調(diào)用真實的對象方法。

多態(tài)在代碼中的體現(xiàn)即父類指針指向子類對象。

Animal類的聲明


Animal類的實現(xiàn)


Dog類繼承自Animal類


Dog類的實現(xiàn)


測試程序:


二、使用注意

代碼分析:

Dog *d=[[Animal? alloc] init];? 動物是一條狗?語義正確嗎?

NSString *str=[Dog? new];? ? 狗是一個字符串?正確嗎?

Oc語言是一門弱語法的語言,編譯的時候并不會報錯,所以這就要求我們在實際的開發(fā)過程中一定要按照既定的規(guī)范來寫代碼,不要出現(xiàn)狗是一個字符串這樣的問題。

多態(tài)的好處:

需要一個新的函數(shù)專門用來喂狗

Void feed(Dog *d)

{

[d? eat];

}

如果這個時候也需要喂貓,那就應(yīng)該重寫新一個新的函數(shù)

Void feed(Cat *c)

{

[c? eat];

}

而狗和貓實際上都繼承自動物這個類,在這里就可以使用多態(tài)來簡化代碼了。

這里只需要把函數(shù)的參數(shù)寫成是Animal *類型的,那么Dog和Cat類型的對象就都可以傳入進來。

調(diào)用的時候直接改變參數(shù)就可以了。

多態(tài)的局限性:父類類型的指針變量不能直接調(diào)用子類特有的方法。

不建議的做法~

Animal *a=[[Dog alloc] init];

[a run];//在Animal類中沒有run方法,這里調(diào)用了狗對象的方法。

解決方法:可以將a強制轉(zhuǎn)換為Dog*類型的變量,如下:

Dog *d=(Dog *)a;//使用強制轉(zhuǎn)換,這里a和d指向的是同一個狗對象

三、多態(tài)使用總結(jié)

(1)沒有繼承就沒有多態(tài)

(2)代碼的體現(xiàn):父類類型的指針指向子類對象

(3)好處:如果函數(shù)方法參數(shù)中使用的是父類類型,則可以傳入父類和子類對象,而不用再去定義多個函數(shù)來和相應(yīng)的類進行匹配了。

(4)局限性:父類類型的變量不能直接調(diào)用子類特有的方法,如果必須要調(diào)用,則必須強制轉(zhuǎn)換為子類特有的方法。

四、字符串補充內(nèi)容

@“234”字符串也是一個對象,屬于NSString這個類。下面是對字符串對象的一些代碼說明:


字符串對象的length方法:計算的是字符串的字數(shù),而不是像strlen函數(shù)那樣,計算的是字符數(shù)。如“哈ha123”length得出的結(jié)果是6,返回unsigned long類型,而strlen函數(shù)得出的結(jié)果是8,因為一個漢字占3個字節(jié)。

提示:字數(shù)也包括空格。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容