OC面向對象—多態


 

OC面向對象—多態

一、基本概念

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

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

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

Animal類的聲明

 

Animal類的實現

 

Dog類繼承自Animal

 

Dog類的實現

 

測試程序:

 

 

二、使用注意

代碼分析:

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

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

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

多態的好處:

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

Void feed(Dog *d)

{

[d  eat];

}

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

Void feed(Cat *c)

{

[c  eat];

}

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

這里只需要把函數的參數寫成是Animal *類型的,那么DogCat類型的對象就都可以傳入進來。

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

 

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

不建議的做法~

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

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

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

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

 

三、多態使用總結

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

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

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

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

 

四、字符串補充內容

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

 

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

提示:字數也包括空格。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM