我剛開始學習Objective-C,我被斯蒂芬·G·庫奇閱讀Objective-C的第三版編程。滯留在理解Objective-C的動態綁定
有一個段落說明多態性機構:
在運行時,Objective-C運行系統將檢查實際的類對象的存儲內dataValue1(一個id對象)並選擇適當的方法從正確的類到執行。然而,在更一般的情況下,編譯器可能產生不正確的代碼將參數傳遞給方法或處理,如果一個方法把一個對象作爲參數,另一個花了浮點其回報價值。會發生例如,點值。例如,如果一個方法返回一個對象,而另一個返回一個整數,則返回 。如果兩個方法之間的不一致只是一種不同類型的對象(例如,Fraction的add:方法將Fraction對象作爲其參數並返回一個,而Complex的add:方法接受並返回一個Complex對象),編譯器將仍然會生成正確的代碼,因爲無論如何都將內存地址(即指針)作爲對象的引用進行傳遞。
我不太明白,該段的第一部分說,編譯器可能產生不正確的代碼,如果我宣佈2種方法在不同的類具有相同的名稱和不同類型的參數。而該段的最後一部分說,這是罰款,有2種方法具有相同的名稱和不同的參數和返回值的類型......哦不......
我有以下的代碼,他們編譯和運行良好:
@implementation A
- (int) add:(int)a {
return 1 + a;
}
@end
@implementation B
- (int) add: (B*) b {
return 100;
}
@end
id a = [[A alloc] init];
id b = [[B alloc] init];
NSLog(@"A: %i, B %i", [a add:100], [b add:b]);
編輯: 正如我所引用的文字,上面的代碼應該引起錯誤,但它只是產生一些警告消息,名爲「補充:」 多種方法找到,不兼容的指針整數轉換髮送 「ID」 到類型的參數 「INT」
我有Java和C++背景,我知道Objective-C中的多態性與那些語言稍有不同,但我仍然對不確定性(粗體文本)感到困惑。
我想我一定是誤解了什麼東西,你會請有關動態Objective-C中,我結合和那些誰需要更詳細的解釋?
謝謝你!
相關:[非正式協議的需求是什麼?](http://stackoverflow.com/q/7561630/557219)。 – 2011-11-06 05:24:33