クラスクラスター初期化
-
01-10-2019 - |
質問
私のiPhoneアプリには、抽象的なクラスWorkingViewがあります。 Uiviewのサブクラスです。 WorkingViewには、コンクリートのサブクラスがたくさんあります。そのうち2つはSimplifyViewとMultiplyViewです。
WorkingViewの新しいインスタンスを作成する方法を作成しようとしています。この方法では、モードが渡され、適切なコンクリートサブクラスのインスタンスを返す必要があります。の答えに従って この質問, 、これは私がこれまでに持っているものです:
+ (id)newWorkingViewWithFrame:(CGRect)frame mode: (modeEnum) mode {
WorkingView *ret;
switch (mode) {
case simplifyMode:
ret = [[SimplifyView alloc]initWithFrame: frame];
break;
case multiplyMode:
ret = [[MultiplyView alloc]initWithFrame: frame];
break;
// additional cases here
default:
return nil;
}
// more initialization here
return ret;
}
ここまでは順調ですね。しかし、ここに問題があります。 SimplifyViewのinitメソッドでは、uiviewのinitメソッドを介してオブジェクトを実行する必要があります。 [super initwithframe:frame]を呼び出すと、uiviewまでのすべてではなく、WorkingViewだけになります。私は、uiviewのinitframe:method-を呼び出すinitywithframe:method in workingviewを作成できると思いますが、それはハッキッシュです。
これを処理する適切な方法は何ですか?
解決
あなたが電話するなら [super initWithFrame:frame]
サブクラスから、ランタイムは、スーパーから始まるメソッドを実装するクラスを探して、継承階層を登ります。 Superが実装していない場合 initWithFrame:
, 、ランタイムは、最終的にUIVIEWでデフォルトの実装を見つけて呼び出すまで登り続けます。
所属していません StackOverflow