——Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! ——-
一.多态概念
多态的前提,必須存在繼承關系,在代碼中的表現形式就是父類類型儲存子類類型,即父類的指針指向子類對象。
二.多态特性
在OC中,調用方法是,會檢測對象的真實類型,稱為動态綁定。
父類儲存子類指針,在調用方法時,有以下步驟:
1).在編譯的時候,會檢查 父類指向子類的指針 調用的方法,在父類中是否存在,如果有,編譯通過
2).在運作時,會動态檢測 初始對象 的真實類型
三.多态用途
提供動态綁定特性,減少不必要的程式備援。在方法中,把父類當成參數,使該方法具備調用所有子類同樣方法的能力
四.多态好處
多态的出現提高了程式的擴充性和後期可維護型.
五.多态局限性
如果子類中有父類沒有的方法,通過父類的指針調用該方法時,需要進行強制類型轉換。否則會報錯。
強類型轉換方式:
Cat cat =(Cat ) animal;
六.代碼
動物類:Animal 具有 eat 方法
子類:Cat類 Dog類,都繼承父類的eat 方法,并重載
飼養員類:Breeder 具有 飼養cat dog 的方法。
1.animal 父類
===Animal.h===
@interface Animal : NSObject
-(void)eat;
@end
2.dog cat子類
===Cat===
@interface Cat : Animal
@end
@implementation Cat
-(void)eat
{
NSLog(@"Cat eat ..");
}
@end
===Dog===
@interface Dog : Animal
@end
@implementation Dog
-(void)eat
{
NSLog(@"Dog eat ...");
}
@end
3.飼養員類
===Breeder.h===
@interface Breeder : NSObject
//非多态
-(void)breedCat:(Cat *)cat;
-(void)breedDog:(Dog *)dog;
//多态
-(void)breed:(Animal *)animal;
@end
===Breeder.m===
@implementation Breeder
//飼養 Cat
-(void)breedCat:(Cat *)cat
{
[cat eat];
}
//飼養 Dog
-(void)breedDog:(Dog *)dog
{
[dog eat];
}
-(void)breed:(Animal *)animal
{
[animal eat];
}
@end
4.主函數
int main(int argc, const char * argv[])
{
@autoreleasepool {
//模拟飼養員飼養動物
Breeder *breeder = [[Breeder alloc]init];
NSLog(@"======非多态調用 ======");
//需要為每個動物寫個方法,調用對象的飼養動物方法
Cat *cat = [[Cat alloc]init];
[breeder breedCat:cat];
Dog *dog = [[Dog alloc]init];
[breeder breedDog:dog];
NSLog(@"======多态調用 ======");
//不比為每個動物提供具體方法,減少備援
//聲明父類來接收子類的指針
Animal *c = [[Cat alloc]init];
Animal *d = [[Dog alloc]init];
[breeder breed:c];
[breeder breed:d];
//也可以直接把子類當成參數
[breeder breed:cat];
[breeder breed:dog];
}
return ;
}