似乎有它是否能夠在Objective-C「過載」的方法的一些爭論/不一致。拋開Objective-C中定義方法重載是不可能的,因爲術語與C++相同(因爲方法簽名語法的差異),所以我會特別問:下列哪項是允許的,哪些不是?Objective-C的方法覆蓋/重載混亂
1)的一類聲明/實施這兩種方法:
- (void) doSomethingWithObject:(ClassA*) object;
- (void) doSomethingWithObject:(ClassB*) object;
2)一類聲明/實施這兩種方法:
- (void) doSomethingWithObject:(ClassA*) object;
- (BOOL) doSomethingWithObject:(ClassA*) object;
3)一類聲明/實現該方法:
- (void) doSomethingWithObject:(ClassB*) object;
...當其超類聲明/實現此方法時:
- (void) doSomethingWithObject:(ClassA*) object;
(和衝突的返回值的類似物),兩者都在A)ClassB
從ClassA
,和B)不下降。
OK,所以基本上,對於同一個類中的每個方法,字符串(例如)「methodWithParam1:param2:param3:」('選擇器')必須是唯一的,並且在子分類(覆蓋)時更改參數類型/好嗎? – 2012-07-07 11:09:09
情況3很可能會生成編譯器警告。超類的方法需要'ClassA'的一個實例。這意味着該類的所有對象*及其子類*都必須接受同一方法的任何'ClassA'對象。這是必要的,因爲子類的實例可以在超類的實例可以使用的任何地方使用。但是你試圖用更狹窄的要求重新聲明方法 - 它只接受'ClassB'的對象。這是正確的,在運行時,該方法將被調用,但它是否會工作,因爲它傳遞的是另一個問題。 – 2012-07-07 14:24:37
我想知道UITableView的委託屬性會發生什麼情況。它應該覆蓋UIScrollView的委託屬性,但它進一步限制它只接受也符合UITableViewDelegate協議的對象。我不知道內部,但我相信你不能'推翻'ivars。我假設UITableView中的-setDelegate:propert訪問器在傳遞的參數(參數)中施加了額外的限制。 – 2012-07-08 13:26:38