簡體   English   中英

Objective-C方法覆蓋/重載混淆

[英]Objective-C method overriding/overloading confusion

關於Objective-C中是否有可能“重載”方法,似乎存在一些爭論/分歧。 暫且不能在Objective-C中定義方法重載是與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) ClassBClassA下降,B)不是。

問題1:無法做到:Objective-C不包括方法名稱中的類型; 沒有破壞。 它可能適用於Objective-C ++ - 從未使用過那么多。

問題2:相同。 不行。

問題3:會工作嗎

編輯:通常,方法名稱不包含任何類型,因此如果您刪除類型並且它們是相同的,那么它將被視為相同,因此將不允許在同一個類中。 順便說一下,如果它在不同的類中它會起作用,盡管如果調用中使用的類型和被調用的類型不完全一致,你可能會感到困惑。

您正在考慮C ++,其中編譯器執行靜態綁定,根據輸入的類型確定要調用的實例方法。

Objective-C無法正常工作。 相反,所有綁定在運行時都是動態的。 有點像在C ++中聲明為“虛擬”的所有方法。 程序員負責傳遞適當的變量,這些變量以您的方法所期望的方式響應。

您的方法可以查詢傳入的對象是否響應某些選擇器,並根據需要采取適當的操作,如果您需要更強大的行為。 或者你的方法可以詢問傳入的對象是否是它所期望的類型。 同樣,這將在您的方法中在運行時完成。 不是由編譯器。

所以答案是,聲明為:

- (void) doSomethingWithObject:(id) object;

......然后傳入你喜歡的任何物體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM