
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ù)也包括空格。
