多態的前提:
必須存在繼承關係,在代碼中的表現形式就是父類類型保存子類類型,即父類
的指針指向子類對象。
多態的使用:
@1. 父類的引用指向子類的對象,發送消息,調用的是子類對象的方法。
@2. 父類的引用指向本類的對象,發送消息,調用本類的方法。
在多態下,父類的引用可以指向子類的引用,當編譯的時候,編譯器無法確定指向的對象是什麼類型,所有編譯器會將引用當做父類類型引用編譯檢查。
在調用方法時,發現確實是子類對象,爲子類類型創建空間。
例如:Person *p=[Student alloc] init];編譯時,會Student 類型當成Person類型編譯。[p play];運行時,調用的是Student類型的對象。
在OC中,調用方法是,會檢測對象的真實類型,稱爲動態綁定。
父類保存子類指針,在調用方法時,有以下步驟:
@1. 在編譯的時候,會檢查 父類指向子類的指針 調用的方法,在父類中是
否存在,如果有,編譯通過
@2. 在運行時,會動態檢測 初始對象 的真實類型
多態的好處:
@1. 提供動態綁定特性,減少不必要的程序冗餘。在方法中,把父類當成參數,使
該方法具備調用所有子類同樣方法的能力,不比爲每個子類都寫個方法。
@2. 多態的出現提高了程序的擴展性和後期可維護型
例如:
-(
void
)breed:(Animal *)animal
{
[animal eat];
}