2012-11-13 20 views
5

我從那裏你初始化類,然後返回自己像這樣目標C類,爲什麼返回 - (ID),而不是它自己的類

public class MyClass{ 
    public int Id; 
    public string Name; 
} 

MyClass classInstance = new MyClass(); 
: 
: 

我知道C#是從目標C不同的是C#的背景來了,但我試圖找到一種方法來輕鬆理解目標c如何使轉換更容易。並找出最佳實踐。

無論如何,我的問題是爲什麼你必須創建一個方法並返回一個「id」而不是返回它自己的類型?像這樣:

- (id)initWithID:(NSInteger)id name:(NSString *)name 
{ 
    self = [self init]; 
    if (self) { 
     self.ID = id; 
     self.name = name; 
    } 
    return self; 
} 

感謝您的時間

+0

你的問題已經回答在這個線程:http://stackoverflow.com/questions/8612919/in-objective-c-why-is-id-used-as-return-type-for-init-methods –

+0

我確實已經看到了一個,但它對我沒有意義。我認爲發佈一個新問題讓我更容易到另一個問題。如果它浪費了空間但是它仍然幫助我,我表示歉意。 – gdubs

+0

沒問題。也許參考可以幫助別人。 –

回答

11

你,因爲繼承的初始化方法返回id類型的對象。

想想這樣:你有一個類Foo的對象。它有一個名爲initWithWidgets的init方法。現在,您創建Foo的子類並將其命名爲Bar。根據繼承規則,它可以訪問initWithWidgets方法。如果initWithWidgets的返回類型爲Foo,那麼您的Bar類將無法使用它來自行初始化!返回類型與您嘗試實例化的對象不同。因此,如果您使用id,則表示「此對象的返回類型可以是任何類型」,並且您對子類是安全的!

+0

我明白了,現在有道理!對於記錄,我確實看到了來自不同鏈接的回答問題,我只是很難理解它。這使得imo更有意義。再次感謝 – gdubs

3

當方法返回類型爲id的對象時,表示對象可以是任何類型。例如,如果你聲明NSMutableArray,你這樣做:

NSMutableArray *someArray = [[NSMutableArray alloc] init]; 

init將返回一個NSMutableArray對象。有時候,init方法可能會返回一個父類,如本例中的NSArray。使用id類型允許返回任何對象。

+0

謝謝你的另一個很好的例子! – gdubs

相關問題