OC面向?qū)ο蟆鄳B(tài)
OC面向?qū)ο蟆鄳B(tài)
一排龄、基本概念
多態(tài)在代碼中的體現(xiàn),即為多種形態(tài)茶鹃,必須要有繼承涣雕,沒有繼承就沒有多態(tài)。
在使用多態(tài)是闭翩,會(huì)進(jìn)行動(dòng)態(tài)檢測(cè)挣郭,以調(diào)用真實(shí)的對(duì)象方法。
多態(tài)在代碼中的體現(xiàn)即父類指針指向子類對(duì)象疗韵。
Animal類的聲明
Animal類的實(shí)現(xiàn)
Dog類繼承自Animal類
Dog類的實(shí)現(xiàn)
測(cè)試程序:
二兑障、使用注意
代碼分析:
Dog *d=[[Animal? alloc] init];? 動(dòng)物是一條狗?語(yǔ)義正確嗎蕉汪?
NSString *str=[Dog? new];? ? 狗是一個(gè)字符串流译?正確嗎?
Oc語(yǔ)言是一門弱語(yǔ)法的語(yǔ)言者疤,編譯的時(shí)候并不會(huì)報(bào)錯(cuò)福澡,所以這就要求我們?cè)趯?shí)際的開發(fā)過程中一定要按照既定的規(guī)范來寫代碼,不要出現(xiàn)狗是一個(gè)字符串這樣的問題驹马。
多態(tài)的好處:
需要一個(gè)新的函數(shù)專門用來喂狗
Void feed(Dog *d)
{
[d? eat];
}
如果這個(gè)時(shí)候也需要喂貓革砸,那就應(yīng)該重寫新一個(gè)新的函數(shù)
Void feed(Cat *c)
{
[c? eat];
}
而狗和貓實(shí)際上都繼承自動(dòng)物這個(gè)類,在這里就可以使用多態(tài)來簡(jiǎn)化代碼了糯累。
這里只需要把函數(shù)的參數(shù)寫成是Animal *類型的算利,那么Dog和Cat類型的對(duì)象就都可以傳入進(jìn)來。
調(diào)用的時(shí)候直接改變參數(shù)就可以了泳姐。
多態(tài)的局限性:父類類型的指針變量不能直接調(diào)用子類特有的方法效拭。
不建議的做法~
Animal *a=[[Dog alloc] init];
[a run];//在Animal類中沒有run方法,這里調(diào)用了狗對(duì)象的方法胖秒。
解決方法:可以將a強(qiáng)制轉(zhuǎn)換為Dog*類型的變量缎患,如下:
Dog *d=(Dog *)a;//使用強(qiáng)制轉(zhuǎn)換,這里a和d指向的是同一個(gè)狗對(duì)象
三阎肝、多態(tài)使用總結(jié)
(1)沒有繼承就沒有多態(tài)
(2)代碼的體現(xiàn):父類類型的指針指向子類對(duì)象
(3)好處:如果函數(shù)方法參數(shù)中使用的是父類類型挤渔,則可以傳入父類和子類對(duì)象,而不用再去定義多個(gè)函數(shù)來和相應(yīng)的類進(jìn)行匹配了盗痒。
(4)局限性:父類類型的變量不能直接調(diào)用子類特有的方法,如果必須要調(diào)用,則必須強(qiáng)制轉(zhuǎn)換為子類特有的方法俯邓。
四骡楼、字符串補(bǔ)充內(nèi)容
@“234”字符串也是一個(gè)對(duì)象,屬于NSString這個(gè)類稽鞭。下面是對(duì)字符串對(duì)象的一些代碼說明:
字符串對(duì)象的length方法:計(jì)算的是字符串的字?jǐn)?shù)鸟整,而不是像strlen函數(shù)那樣,計(jì)算的是字符數(shù)朦蕴。如“哈ha123”length得出的結(jié)果是6篮条,返回unsigned long類型,而strlen函數(shù)得出的結(jié)果是8吩抓,因?yàn)橐粋€(gè)漢字占3個(gè)字節(jié)涉茧。
提示:字?jǐn)?shù)也包括空格。