そのように初期化するオブジェクトがあると仮定します
- (void)doInit
{
NSLog(@"In BaseClass init");
}
- (id)init
{
self = [super init];
[self doInit];
return self;
}
同様の方法で開始されるサブクラスがあります
- (void)doInit
{
NSLog (@"In SubClass init");
}
- (id)init
{
self = [super init];
[self doInit];
return self;
}
子クラスのインスタンスを作成すると、次の出力が表示されます。
In SubClass init
In SubClass init
本当に、私が起こるつもりだったのは
In BaseClass init
In SubClass init
doInit をマークして、オーバーライドしてはならないこと、またはサブクラスのすべてのメソッドに一意の名前を作成する必要があることを示す方法はありますか?
以前にこの問題に出くわしたことがなかった理由は完全にはわかりませんが、どうぞ。
編集:
なぜこれが起こっているのか理解しています。基本クラスがオーバーライドされた関数を呼び出せるとは思っていませんでした。
[super doInit] を呼び出すこともできません。これは、BaseClass のインスタンスの作成が引き続き機能するように、BaseClass が doInit を呼び出す必要があるためです。[super doInit] を呼び出しても、SubClass の doInit が 2 回呼び出されることになります。
答えはノーのようです。doBaseClassInit や doSubClassInit のように、各 doInit に一意の名前を付ける必要があります。