1. 多態
父類的指針指向子類的指針
不同的子類相應父類的行為
父類:打印機
#import
@interface Printer : NSObject
- (void) print;
@end
#import "Printer.h"
@implementation Printer
- (void)print{
NSLog(@"打印機打印紙張");
}
@end
子類:黑白打印機
#import "BlackPrinter.h"
@implementation BlackPrinter
- (void)print{
NSLog(@"黑白打印機");
}
@end
子類:彩色打印機
#import "Printer.h"
@interface ColorPrinter : Printer ?//修改父類的打印行為
- (void)print;
@end
#import "ColorPrinter.h"
@implementation ColorPrinter
- (void)print{
NSLog(@"彩色打印機");
}
@end
定義一個person類,來操作打印機
#import "Person.h"
@implementation Person
// - (void) printWithColor:(ColorPrinter *)colorPrint{
// [colorPrint print];
?// }
// - (void) printWithBlack:(BlackPrinter *)blackPrint{
// [blackPrint print];
// }
- (void) doPrint:(Printer *)printer{
[printer print];
}
@end
[person printWithBlack:blackPrint];//調用黑白打印機
[person printWithColor:colorPrint];//調用彩色打印機
這種的設計,缺點在于:如果添加的子類特別多,就要在.h的文件里聲明很多方法
- (void) doPrint:(Printer *)printer{
[printer print];
}
這里就到了關鍵點,這個方法傳的參數是父類,而實際傳的是子類型
Printer *p1 = [[BlackPrinter alloc]init];
Printer *p2 = [[ColorPrinter alloc]init];
[person doPrint: p1];?
[person doPrint: p2];?
// 父類的指針調用子類對象的方法,先在子類里去找,找不到就實現父類的方法
注意:子類不能增加父類沒有的方法, 也就是父類方法和子類要一一對應