iOS--多態(tài)

打印機(jī)的例子

抽象的打印機(jī)類Printer

Printer.h

//

//? Printer.h

//? 07_DynamicDemo

//

//? Created by jiangwei on 14-10-11.

//? Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import

@interface Printer : NSObject

- (void) print;

@end

就是一個(gè)簡單的方法print

Printer.m

//? Printer.m

//? 07_DynamicDemo

//

//? Created by jiangwei on 14-10-11.

//? Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import "Printer.h"

@implementation Printer

- (void)print{

NSLog(@"打印機(jī)打印紙張");

}

@end

實(shí)現(xiàn)也是很簡單的

下面來看一下具體的子類

ColorPrinter.h


//

//? ColorPrinter.h

//? 07_DynamicDemo

//

//? Created by jiangwei on 14-10-11.

//? Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import "Printer.h"

//修改父類的打印行為

@interface ColorPrinter : Printer

- (void)print;

@end

ColorPrinter.m

//

//? ColorPrinter.m

//? 07_DynamicDemo

//

//? Created by jiangwei on 14-10-11.

//? Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import "ColorPrinter.h"

@implementation ColorPrinter

- (void)print{

NSLog(@"彩色打印機(jī)");

}

@end

在看一下另外一個(gè)子類

BlackPrinter.h

BlackPrinter.m

//

//? BlackPrinter.m

//? 07_DynamicDemo

//

//? Created by jiangwei on 14-10-11.

//? Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import "BlackPrinter.h"

@implementation BlackPrinter

- (void)print{

NSLog(@"黑白打印機(jī)");

}

@end

這里我們在定義一個(gè)Person類,用來操作具體的打印機(jī)

Person.h

Person.m

//

//? Person.m

//? 07_DynamicDemo

//

//? Created by jiangwei on 14-10-11.

//? Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import "Person.h"

@implementation Person

/*

- (void) printWithColor:(ColorPrinter *)colorPrint{

[colorPrint print];

}

- (void) printWithBlack:(BlackPrinter *)blackPrint{

[blackPrint print];

}

*/

- (void) doPrint:(Printer *)printer{

[printer print];

}

@end

再來看一下測試代碼:

main.m

//? main.m

//? 07_DynamicDemo

//

//? Created by jiangwei on 14-10-11.

//? Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import

#import "Person.h"

#import "BlackPrinter.h"

#import "ColorPrinter.h"

int main(int argc, const charchar * argv[]) {

@autoreleasepool {

Person *person =[[Person alloc] init];

ColorPrinter *colorPrint = [[ColorPrinter alloc] init];

BlackPrinter *blackPrint = [[BlackPrinter alloc] init];

//多態(tài)的定義

/*

Printer *p1 = [[ColorPrinter alloc] init];

Printer *p2 = [[BlackPrinter alloc] init];

[person doPrint:p1];

[person doPrint:p2];

*/

//通過控制臺輸入的命令來控制使用哪個(gè)打印機(jī)

int cmd;

do{

scanf("%d",&cmd);

if(cmd == 1){

[person doPrint:colorPrint];

}else if(cmd == 2){

[person doPrint:blackPrint];

}

}while (1);

}

return 0;

}

下面就來詳細(xì)講解一下多態(tài)的好處

上面的例子是一個(gè)彩色打印機(jī)和黑白打印機(jī)這兩種打印機(jī),然后Person類中有一個(gè)操作打印的方法,當(dāng)然這個(gè)方法是需要打印機(jī)對象的,如果不用多態(tài)機(jī)制實(shí)現(xiàn)的話(Person.h中注釋的代碼部分),就是給兩種打印機(jī)單獨(dú)定義個(gè)操作的方法,然后在Person.m(代碼中注釋的部分)中用具體的打印機(jī)對象進(jìn)行操作,在main.m文件中,我們看到,當(dāng)Person需要使用哪個(gè)打印機(jī)的時(shí)候,就去調(diào)用指定的方法:

[person printWithBlack:blackPrint];//調(diào)用黑白打印機(jī)

[person printWithColor:colorPrint];//調(diào)用彩色打印機(jī)

這種設(shè)計(jì)就不好了,為什么呢?假如現(xiàn)在又有一種打印機(jī),那么我們還需要在Person.h中定義一種操作這種打印機(jī)的方法,那么后續(xù)如果在添加新的打印機(jī)呢?還在添加方法嗎?那么Person.h文件就會(huì)變得很臃腫。所以這時(shí)候多態(tài)就體現(xiàn)到好處了,使用父類類型,在Person.h中定義一個(gè)方法就可以了:

1

- (void) doPrint:(Printer *)printer;

這里看到了,這個(gè)方法的參數(shù)類型就是父類的類型,這就是多態(tài),定義類型為父類類型,實(shí)際類型為子類類型

- (void) doPrint:(Printer *)printer{

[printer print];

}

這里調(diào)用print方法,就是傳遞進(jìn)來的實(shí)際類型的print方法。

Printer *p1 = [[ColorPrinter alloc] init];

Printer *p2 = [[BlackPrinter alloc] init];

[person doPrint:p1];

[person doPrint:p2];

這里的p1,p2表面上的類型是Printer,但是實(shí)際類型是子類類型,所以會(huì)調(diào)用他們自己對應(yīng)的print方法。

從上面的例子中我們就可以看到多態(tài)的特新很是重要,當(dāng)然也是三大特性中比較難理解的,但是在coding的過程中,用多了就自然理解了,沒必要去刻意的理解。

參考:http://www.cocoachina.com/ios/20141211/10609.html



多態(tài)就是父類指針指向子類對象

1.當(dāng)方法的參數(shù)是一個(gè)父類類型的時(shí)候,那么傳遞的實(shí)參可以是父類對象也可以是子類對象。

2.當(dāng)一個(gè)父類指針指向一個(gè)子類對象的時(shí)候,只能通過父類指針訪問子類對象中的繼承成員,子類獨(dú)有的不能訪問。

多態(tài)的好處

多態(tài)的主要好處就是簡化了編程接口。它容許在類和類之間重用一些習(xí)慣性的命名,而不用為每一個(gè)新加的函數(shù)命名一個(gè)新名字。這樣,編程接口就是一些抽象的行為的集合,從而和實(shí)現(xiàn)接口的類的區(qū)分開來。

多態(tài)也使得代碼可以分散在不同的對象中而不用試圖在一個(gè)函數(shù)中考慮到所有可能的對象。這樣 使得代碼擴(kuò)展性和復(fù)用性更好一些。當(dāng)一個(gè)新的情景出現(xiàn)時(shí),無須對現(xiàn)有的代碼進(jìn)行改動(dòng),而只需要增加一個(gè)新的類和新的同名方法。

參考:http://blog.csdn.net/qq_31810357/article/details/48968405

面向?qū)ο缶幊倘筇匦灾痪陀卸鄳B(tài),多態(tài)是指在程序運(yùn)行時(shí),相同的消息可能會(huì)發(fā)給繼承自同一個(gè)父類的不同類型的對象,雖然是同一個(gè)方法,但是運(yùn)行時(shí)系統(tǒng)會(huì)根據(jù)當(dāng)前對象所屬的具體類型作出不同的響應(yīng)。

面向?qū)ο笕筇匦灾?,繼承和封裝都是為了代碼重用,繼承可以繼承自父類的特征和屬性,封裝可以將實(shí)現(xiàn)細(xì)節(jié)封裝,外界調(diào)用實(shí)現(xiàn)某些功能。而多態(tài)則是為了接口重用。

多個(gè)子類繼承同一個(gè)父類,就會(huì)具有和父類相同的行為和特征,子類可以對父類的方法進(jìn)行重寫,所以可能同一個(gè)方法每個(gè)子類的實(shí)現(xiàn)都不同。通過父類指針指向任意子類對象并調(diào)用相同方法,可能會(huì)得到不同的結(jié)果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,742評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內(nèi)容