一、定義:
重載、重寫和隱藏是很容易混淆的類似概念。雖然所有這三種技術都使您得以創建同名的成員,但它們之間有一些重要的差異。
-
重載的成員用於提供屬性或方法的不同版本,這些版本具有相同名稱但是接受不同數量的參數或者接受不同數據類型的參數。
-
重寫的屬性和方法用於替換在派生類中不適合的繼承的屬性或方法。重寫的成員必須接受同一數據類型和參數數量。派生類繼承重寫的成員。
-
隱藏的成員用於局部替換具有更廣范圍的成員。任何類型都可隱藏任何其他類型。例如,可聲明隱藏同名繼承方法的屬性。無法繼承隱藏的成員。
Objective-c中類的繼承與C++類似,不同的是Objective-c不支持多重繼承,一個類只能有一個父類,單繼承使Objective-c的繼承關系很簡單,易於管理程序。
Objective-c中所有類的父類是NSObject。
二、方法重寫
在Objective-c中,子類可繼承父類中的方法,而不需要重新編寫相同的方法,直接可以使用父類的方法。
但有時我們不想使用使用父類方法,而是想作一定的修改,怎么辦呢?只要將子類中書寫一個與父類具有相同的方法名、返回類型和參數,就可以將將父類的方法覆蓋重寫。比較簡單。
三、方法重載
在Objective-c中,方法是不能重載的。也就是說我們不能在類中定義這樣的兩個方法:它們的名子相同,參數個數相同,參數類型不同,不同的返回值類型。否則Xcode會報錯。
四、總結
1.什么是重載?oc中不存在重載。
在同一作用域內,可以有一組具有相同函數名,不同參數列表的函數,這組函數被稱為重載函數
C++函數名相同是函數的名稱相同。參數列表不同指參數的個數或者類型不同。
oc中函數名相同包含函數名稱和所有的標簽相同。oc不允許同一作用域內的同名函數,因此不允許重載。
即不允許函數名相同,參數個數相同,但類型不同的兩個函數存在。
在oc中同一作用域內不允許相同函數名,因此oc中沒有嚴格意義的重載。如:
在c++中構成重載,因為函數名test重復,但參數類型不同。在oc中錯誤,因為函數名都是test,不構成重載
通過一個方法包含另一個方法,達到類似重載的功能,它們具有不同的函數名。通常用於構造函數,如:
init()
intwithx(){包含對init的調用}
intwithxy().....{包含對initx的調用}
越具體的函數可以在前面已有方法基礎上建立
2.什么是重寫?
重寫發生在子類和父類之間,通過在子類中定義和父類相同方法名的方法,修改從父類繼承過來的方法定義。
重寫的作用是修改從父類繼承過來的方法定義。(繼承只能增加,修改,不能減少或者刪除父類方法)
重寫的要求:包括所有的標簽相同即包括了參數個數需要相同,並且返回值要相同。
重寫之后的方法查找過程:使用子類指針調用方法時,優先選擇子類方法,沒有的情況下才尋找父類的方法。
若要直接使用父類方法,使用super.體現了父子之間的多態性,如何尋找父子同名方法