2012-02-14 88 views
1

假設我有一個名爲Item的類。這是NewsItem和TwitterItem的超類。爲什麼在Objective C構造函數中使用[super init]?

如果我想創造一些NewsItem的做我必須使用(內部構造)

self = [super init]; 

如果是,爲什麼?在Java/C#中,我只想做,

NewsItem n = new NewsItem(); 

我不必在Java/C#中對超類做任何事情。只是無法把握它。

+1

可能的重複[爲什麼我應該調用self = \ [super init \]](http://stackoverflow.com/questions/2956943/why-should-i-call-self-super-init) – 2012-02-14 19:43:07

回答

6

在Java和C#中,如果不明確調用它,編譯器會自動讓您的構造函數調用超類的構造函數。例如,the 「Java Tutorials」 say this

如果構造函數沒有明確調用父類的構造函數,Java編譯器會自動插入到超類的無參構造函數的調用。如果超類沒有沒有參數的構造函數,那麼你會得到一個編譯時錯誤。對象確實有這樣的構造函數,所以如果Object是唯一的超類,那就沒有問題了。

在Objective-C中,編譯器不會自動執行它,所以你必須自己做。

+0

這正是我想要的解釋。謝謝 – xrDDDD 2012-02-15 23:40:51

5

因爲你的超類(和你的超類的超類)也需要初始化的機會。

而且,請記住,您的超類將[很少]返回零或不同的實例。

這就是爲什麼你做的事:

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     ... init stuff .... 
    } 
    return self; 
} 
+0

Kevin補充說返回類型。謝謝。由於(id)是默認值,因此不是必須的,但我也更喜歡它。 – bbum 2012-02-14 22:57:51

0

因爲您的自定義對象將至少從所有對象的母親那裏繼承:NSObject的,你必須調用「[超級初始化];」 'super'只是調用其超類的init方法

1

因爲您正在重寫init消息。如果你不覆蓋它,那麼[[NewsItem alloc] init]只會調用超類的init消息。在C#中,你可以使用base來做同樣的事情。

相關問題