質問

私の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でデフォルトの実装を見つけて呼び出すまで登り続けます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top