OC面向對象—多態函數
1、基本概念測試
多態在代碼中的體現,即爲多種形態,必需要有繼承,沒有繼承就沒有多態。指針
在使用多態是,會進行動態檢測,以調用真實的對象方法。對象
多態在代碼中的體現即父類指針指向子類對象。blog
Animal類的聲明繼承
Animal類的實現開發
Dog類繼承自Animal類字符串
Dog類的實現it
測試程序:編譯
2、使用注意
代碼分析:
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指向的是同一個狗對象
3、多態使用總結
(1)沒有繼承就沒有多態
(2)代碼的體現:父類類型的指針指向子類對象
(3)好處:若是函數方法參數中使用的是父類類型,則能夠傳入父類和子類對象,而不用再去定義多個函數來和相應的類進行匹配了。
(4)侷限性:父類類型的變量不能直接調用子類特有的方法,若是必需要調用,則必須強制轉換爲子類特有的方法。
4、字符串補充內容
@「234」字符串也是一個對象,屬於NSString這個類。下面是對字符串對象的一些代碼說明:
字符串對象的length方法:計算的是字符串的字數,而不是像strlen函數那樣,計算的是字符數。如「哈ha123」length得出的結果是6,返回unsigned long類型,而strlen函數得出的結果是8,由於一個漢字佔3個字節。
提示:字數也包括空格。