1.什么是多態(tài)?
-
什么是多態(tài):多態(tài)就是某一類事物的多種形態(tài)
- 貓: 貓-->動(dòng)物
- 狗: 狗-->動(dòng)物
- 男人 : 男人 -->人 -->高級(jí)動(dòng)物
- 女人 : 女人 -->人 -->高級(jí)動(dòng)物
程序中的多態(tài):父類指針指向子類對(duì)象
2.多態(tài)的條件
- 有繼承關(guān)系
- 子類重寫父類方法
- 父類指針指向子類對(duì)象
狗 *g = [狗 new];
動(dòng)物 *a = [狗 new];
貓 *c = [貓 new];
動(dòng)物 *a = [貓 new];
- 表現(xiàn):當(dāng)父類指針指向不同的對(duì)象的時(shí)候眠饮,通過(guò)父類指針調(diào)用被重寫的方法的時(shí)候扰路,會(huì)執(zhí)行該指針?biāo)赶虻哪莻€(gè)對(duì)象的方法
3.多態(tài)的優(yōu)點(diǎn)
多態(tài)的主要好處就是簡(jiǎn)化了編程接口涯保。它允許在類和類之間重用一些習(xí)慣性的命名,而不用為每一個(gè)新的方法命名一個(gè)新名字鹿响。這樣,編程接口就是一些抽象的行為的集合,從而和實(shí)現(xiàn)接口的類的區(qū)分開(kāi)來(lái)。
多態(tài)也使得代碼可以分散在不同的對(duì)象中而不用試圖在一個(gè)方法中考慮到所有可能的對(duì)象傻唾。 這樣使得您的代碼擴(kuò)展性和復(fù)用性更好一些投慈。當(dāng)一個(gè)新的情景出現(xiàn)時(shí),您無(wú)須對(duì)現(xiàn)有的代碼進(jìn)行 改動(dòng),而只需要增加一個(gè)新的類和新的同名方法。
4.如何實(shí)現(xiàn)多態(tài)
- Animal是父類,子類有Cat 和 Dog,子類分別重寫了父類中的eat方法;實(shí)例化對(duì)象的時(shí)候可以用下面的方法:
Animal *animal = nil;
//實(shí)例化貓的對(duì)象
animal = [Cat new];
[animal eat];
//實(shí)例化狗的對(duì)象
animal = [Dog new];
[animal eat];
5.多態(tài)的原理
- 動(dòng)態(tài)綁定:
- 動(dòng)態(tài)類型能使程序直到執(zhí)行時(shí)才確定對(duì)象的真實(shí)類型
- 動(dòng)態(tài)類型綁定能使程序直到執(zhí)行時(shí)才確定要對(duì)那個(gè)對(duì)象調(diào)用的方法
- OC不同于傳統(tǒng)程序設(shè)計(jì)語(yǔ)言,它可以在運(yùn)行時(shí)加入新的數(shù)據(jù)類型和新的程序模塊:動(dòng)態(tài)類型識(shí)別,動(dòng)態(tài)綁定,動(dòng)態(tài)加載
- id類型:通用對(duì)象指針類型,弱類型,編譯時(shí)不進(jìn)行具體類型檢查
6.多態(tài)的注意點(diǎn)
- 1)如果存在多態(tài),父類是可以訪問(wèn)子類特有的方法
假設(shè) 子類 Dog 有一個(gè)特有的方法bark
[dog bark];
Animal *an2 = [Dog new];
[(Dog*)an2 bark]; //把父類的指針,強(qiáng)制類型轉(zhuǎn)換
- 2)如果不存在多態(tài),父類是不可以訪問(wèn)子類特有的方法的
Animal *an3 = [Animal new];
[(Dog*)an3 bark]; //錯(cuò)誤的,不能強(qiáng)制轉(zhuǎn)換