打印機(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é)果。