2014-01-20 55 views
1

嗨,我是一個新手,以客觀-C,今天我學習動態類型的概念,並結合,一切都很好,直到我寫和執行該程序爲什麼具有相同名稱(屬於不同類)的兩個方法在使用動態類型和動態綁定時應該具有相同的原型?

#import <Foundation/Foundation.h> 
@interface A:NSObject 
@property int var; 
-(int)add:(A*)argObj; 
@end 

@implementation A 
@synthesize var; 
-(int)add:(A *)argObj 
{ 
    return (self.var + argObj.var); 
} 
@end 


@interface B:NSObject 
@property double var1; 
-(double)add:(B *)argObj; 
@end 

@implementation B 
@synthesize var1; 
-(double)add:(B *)argObj 
{ 
    return (self.var1 + argObj.var1); 
} 
@end  

int main() 
{ 
    @autorleaease{ 
     id data1, data2; 
     A * aobj1 = [[A alloc]init]; 
     aobj1.var = 30; 
     A * aobj2 = [[A alloc]init]; 
     aobj2.var = 50; 
     data1 = aobj1; 
     data2 = aobj2; 
     NSLog(@"The sum of two A objs is : %i",[data1 add: data2]);// prints 80 which is correct 

     B * bobj1 = [[B alloc]init]; 
     bobj1.var1 = 5.5; 
     B * bobj2 = [[B alloc]init]; 
     bobj2.var1 = 5.5; 
     data1 = bobj1; 
     data2 = bobj2; 
     NSLog(@"The sum of 2 B objs is : %f",[data1 add: data2]);// prints 0.0000 why so ???? 
    } 
     return 0; 
} 

我得到的輸出,當我執行加方法,但是當我在類BI上執行add方法時得到了錯誤的答案。爲什麼是這樣??

這就是我的輸出。在輸出編譯器警告我這樣

main.m: In function 'main': 
main.m:47:5: warning: multiple methods named '-add:' found [enabled by default] 
    NSLog(@"The sum of two A objs is : %i",[data1 add: data2]); 
    ^
main.m:8:1: note: using '-(int)add:(A *)argObj' 
-(int)add:(A*)argObj; 
^ 
main.m:8:1: note: also found '-(int)add:(A *)argObj' 
main.m:26:1: note: also found '-(double)add:(B *)argObj' 
-(double)add:(B *)argObj; 
^ 
main.m:55:5: warning: multiple methods named '-add:' found [enabled by default] 
    NSLog(@"The sum of 2 B objs is : %f",[data1 add: data2]); 
    ^
main.m:8:1: note: using '-(int)add:(A *)argObj' 
-(int)add:(A*)argObj; 
^ 
main.m:8:1: note: also found '-(int)add:(A *)argObj' 
main.m:26:1: note: also found '-(double)add:(B *)argObj' 
-(double)add:(B *)argObj; 
^ 

Executing the program.... 
$demo 
2014-01-20 04:06:05.788 demo[30357] The sum of two A objs is : 80 
2014-01-20 04:06:05.789 demo[30357] The sum of 2 B objs is : 0.000000 

編譯器在說多種方式存在,但這些方法是完全屬於不同的類,雖然我們使用動態類型和動態綁定呼叫將得到解決正確的權利??那麼爲什麼我會得到這樣的輸出?在此先感謝.. :)

+0

爲什麼使用'id data1,data2'而不是實際的對象? – trojanfoe

+0

雅我已經做到了,但因爲我是學動態類型和有約束力的,我想利用這裏這些概念我的意思是我想要的調用方法在運行期間得到解決。 – iamyogish

回答

1

這個問題不是真的關於動態綁定(它按預期工作),而是關於傳遞參數。不明確的選擇器禁止編譯器知道使用哪個原型。

Objective-C使用C的ABI進行函數/方法調用和參數傳遞。編譯器必須知道參數的類型。如果一個變量沒有強類型,編譯器不能查找正確的選擇器。如果參數不兼容(如你的情況),這將導致未定義的行爲。

編輯:編譯器實際上告訴大家介紹了困惑:

> main.m:47:5: warning: multiple methods named '-add:' found 
> NSLog(@"The sum of two A objs is : %i",[data1 add: data2]); 
> [...] note: using '-(int)add:(A *)argObj' 

增加兩個A■當這是第一次使用。編譯器會通知您,它使用類別A變體進行調用,這恰巧是正確的。

> main.m:55:5: warning: multiple methods named '-add:' found 
> NSLog(@"The sum of 2 B objs is : %f",[data1 add: data2]); 
> [...] note: using '-(int)add:(A *)argObj' 

這是帶有兩個B對象的第二次日誌調用。編譯器再次抱怨說,這兩個選擇器存在不明確之處,並通知您它再次選擇了A變體。這次這是錯誤的選擇,你會在運行時看到意想不到的結果。

+0

ü說**如果一個變量不是強類型的編譯器無法查找正確的選擇**,我有一個疑問,糾正我,如果我錯了這裏, 當我發出的呼籲'[數據1地址:數據2 ]'第一次返回的結果與預期的結果相同,這意味着傳遞的參數是強類型的函數聲明的參數。 但是,當我第二次進行同樣的呼叫時,爲什麼它給出了錯誤的答案? **是因爲編譯器調用兩個呼叫??相同的選擇** – iamyogish

+0

@iamyogish見編輯。 –

+0

理解:) tnx .. – iamyogish

相關問題