天天看點

?OC面向對象—多态

---------------------- 、、期待與您交流!

----------------------

oc面向對象—多态

一、基本概念

多态在代碼中的展現,即為多種形态,必須要有繼承,沒有繼承就沒有多态。

在使用多态是,會進行動态檢測,以調用真實的對象方法。

多态在代碼中的展現即父類指針指向子類對象。

animal類的聲明

?OC面向對象—多态

animal類的實作

?OC面向對象—多态

dog類繼承自animal類

?OC面向對象—多态

dog類的實作

?OC面向對象—多态

測試程式:

?OC面向對象—多态

二、使用注意

代碼分析:

dog *d=[[animal  alloc] init];   動物是一條狗?語義正确嗎?

nsstring *str=[dog  new];     狗是一個字元串?正确嗎?

oc語言是一門弱文法的語言,編譯的時候并不會報錯,是以這就要求我們在實際的開發過程中一定要按照既定的規範來寫代碼,不要出現狗是一個字元串這樣的問題。

多态的好處:

需要一個新的函數專門用來喂狗

void feed(dog *d)

{

[d  eat];

}

如果這個時候也需要喂貓,那就應該重寫新一個新的函數

void feed(cat *c)

[c  eat];

而狗和貓實際上都繼承自動物這個類,在這裡就可以使用多态來簡化代碼了。

這裡隻需要把函數的參數寫成是animal *類型的,那麼dog和cat類型的對象就都可以傳入進來。

調用的時候直接改變參數就可以了。

多态的局限性:父類類型的指針變量不能直接調用子類特有的方法。

不建議的做法~

animal *a=[[dog alloc] init];

[a run];//在animal類中沒有run方法,這裡調用了狗對象的方法。

解決方法:可以将a強制轉換為dog*類型的變量,如下:

dog *d=(dog *)a;//使用強制轉換,這裡a和d指向的是同一個狗對象

三、多态使用總結

(1)沒有繼承就沒有多态

(2)代碼的展現:父類類型的指針指向子類對象

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

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

四、字元串補充内容

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

?OC面向對象—多态

字元串對象的length方法:計算的是字元串的字數,而不是像strlen函數那樣,計算的是字元數。如“哈ha123”length得出的結果是6,傳回unsigned long類型,而strlen函數得出的結果是8,因為一個漢字占3個位元組。

提示:字數也包括空格。

?OC面向對象—多态

詳細請檢視: