標籤:style blog http ar 使用 sp strong on 2014
一、基本概念
多態在代碼中的體現,即為多種形態,必須要有繼承,沒有繼承就沒有多態。
在使用多態是,會進行動態檢測,以調用真實的對象方法。
多態在代碼中的體現即父類指標指向子類對象。
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 *類型的,那麼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這個類。下面是對字串對象的一些代碼說明:
字串對象的length方法:計算的是字串的字數,而不是像strlen函數那樣,計算的是字元數。如“哈ha123”length得出的結果是6,返回unsigned long類型,而strlen函數得出的結果是8,因為一個漢字佔3個位元組。
提示:字數也包括空格。
Objective-C-物件導向—多態