2012-02-14 29 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) –

答えて

6

コンパイラは、明示的に呼び出さないと、コンストラクタが自動的にスーパークラスコンストラクタを呼び出します。たとえば、the “Java Tutorials” say this

コンストラクタを明示的にスーパークラスのコンストラクタを呼び出していない場合は、Javaコンパイラが自動的にスーパークラスの引数なしのコンストラクタへの呼び出しを挿入します。スーパークラスに引数のないコンストラクタがない場合は、コンパイル時エラーが発生します。 Objectにはこのようなコンストラクタがあるため、Objectが唯一のスーパークラスであれば問題ありません。

Objective-Cでは、コンパイラが自動的に処理しないため、自分で処理する必要があります。

+0

これは私が欲しかった正確な説明でした。ありがとう – xrDDDD

5

スーパークラス(およびスーパークラスのスーパークラス)も初期化する必要があるためです。

あなたのスーパークラスはnilまたは別のインスタンスを返すことはめったにありません。

あなたが理由です:

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

Kevinが追加されました戻り値の型ありがとう。厳密には(id)はデフォルトではありませんが、私も好きです。 – bbum

0

カスタムオブジェクトは、少なくともすべてのオブジェクトの母親から継承されますので、:NSObjectの、あなたが呼び出す必要があり「[スーパーのinit];」 'super'はスーパークラスのinitメソッドを呼び出すだけです

1

initメッセージを上書きしているためです。それを上書きしない場合、[[NewsItem alloc] init]はスーパークラスのinitメッセージを呼び出すだけです。 C#では、同じことを行うにはbaseを使用します。

関連する問題