天天看點

黑馬程式員學習筆記_OC之多态黑馬程式員學習筆記_OC之多态

黑馬程式員學習筆記_OC之多态

1、 多态實質:父類指針指向子類對象,沒有繼承就沒有多态

2、 執行個體:例如設計一個animal類,包括方法eat,輸出“animal eat---”。再設計一個dog類繼承animal,重寫eat方法,輸出“dog eat-----”。可以采用如下代碼實作對dog對象的調用。

Animal *a = [Dognew];

[a eat] ;

這樣的話,輸出的即為dog eat-----,說明調用的是dog的方法。原因是執行時會動态檢測指針的真實類型。

3、 好處:在2的基礎上再設計一個類cat繼承animal,重寫eat方法,輸出“cat eat----”,再設計一個函數feed函數如下:

void feed (dog*d)

{

        [d eat];

}

這個函數可以執行dog吃的動作,但是不能執行cat吃東西的動作,如果想在主函數中調用讓cat吃東西的話,還要設計一個函數如下:

void feed2 (cat*c)

{

        [c eat];

}

這樣在主函數中寫入如下代碼:

Dog *dd = [Dognew];

Cat *cc = [Catnew];

feed(dd);

feed(cc);

這樣才能成功調用貓和狗的吃。

使用多态可以節省上述編法代碼,執行個體如下:

黑馬程式員學習筆記_OC之多态黑馬程式員學習筆記_OC之多态
黑馬程式員學習筆記_OC之多态黑馬程式員學習筆記_OC之多态

4、多态局限性:如果上述例子的狗類中多加一個對象方法run,執行如下代碼:

Animal *a = [Dognew];

[a run];

執行上述代碼時發現有警告但能運作,我們規定不能這樣寫。這是多态的局限性:父類類型的指針不能用來調用子類的特有方法。如果實在想調用可以用強制轉換的方法實作,代碼如下:

Animal *a = [Dognew];

Dog *d = [Dog *]a;

[d run];

即必須轉化為子類類型指針變量。

繼續閱讀