天天看點

黑馬程式員-OC學習日記五之多态

——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 ;
}