什么是多態(tài)
多態(tài)一般都要跟繼承結(jié)合起來說,其本質(zhì)是子類通過覆蓋或重載父類的方法殿雪,來使得對同一類對象同一方法的調(diào)用產(chǎn)生不同的結(jié)果。這里需要辨析的地方在:同一類對象指的是繼承層級再上一層的對象,更加泛化齿兔。
程序中的多態(tài):父類指針指向子類對象
多態(tài)的原理
- 動(dòng)態(tài)綁定
- 動(dòng)態(tài)類型能使程序直到執(zhí)行時(shí)才確定對象的真實(shí)類型
- 動(dòng)態(tài)類型綁定能使程序直到執(zhí)行時(shí)才確定要對那個(gè)對象調(diào)用的方法
多態(tài)條件
有繼承關(guān)系
子類重寫父類方法
父類指針指向子類對象
程序中的表現(xiàn)
父類指針指向不同子類對象的時(shí)候,通過父類指針調(diào)用被重寫的方法的時(shí)候础米,會(huì)執(zhí)行該指針指向的那個(gè)對象的方法
應(yīng)用場景
提高了代碼的擴(kuò)展性
多態(tài)優(yōu)點(diǎn)
多態(tài)的主要好處是簡化了編程接口分苇,他允許在類和類之間重用一些習(xí)慣性的命名,而不用為每一個(gè)新加的函數(shù)命名一個(gè)新名字屁桑,這樣医寿,編程接口就是一些抽象的行為集合,從而和實(shí)現(xiàn)接口的類區(qū)分開來
多態(tài)也使得代碼可以分散在不同的對象中而不用試圖在一個(gè)函數(shù)中考慮到所有可能的對象蘑斧,這樣使得代碼擴(kuò)展性和復(fù)用性特別好靖秩,當(dāng)一個(gè)新的情景出現(xiàn)時(shí),只需要增加一個(gè)新的類和新的同名方法
注意點(diǎn)
如果父類指針指向子類對象竖瘾,如果需要調(diào)用子類特有的方法沟突,必須先強(qiáng)制類型轉(zhuǎn)換為子類才能調(diào)用
- 如果存在多態(tài),父類是可以訪問子類特有的方法
- 如果不存在多態(tài)捕传,父類是不可以訪問子類特有方法的
@interface Phone : NSObject
@property (nonatomic,strong) NSString *name;
- (void)call;
@end
#import "Phone.h"
@implementation Phone
- (void)call{
NSLog(@"%s",__func__);
}
- (NSString *)description
{
return [NSString stringWithFormat:@"%@", _name];
}
@end
---------------
#import "Phone.h"
@interface IPhone : Phone
@end
#import "IPhone.h"
@implementation IPhone
- (void)call{
NSLog(@"%s",__func__);
}
@end
---------------
#import "Phone.h"
@interface Android : Phone
@end
#import "Android.h"
@implementation Android
- (void)call{
NSLog(@"%s",__func__);
}
@end
---------------
- (void)viewDidLoad {
[super viewDidLoad];
Phone *p = [[IPhone alloc]init];
p.name = @"iPhone";
[p call];
NSLog(@"%@",p);
Phone *a = [[Android alloc]init];
a.name = @"Android";
[a call];
NSLog(@"%@",a);
}