1

私の 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] を呼び出すと、WorkingView だけが表示され、UIView までは表示されません。UIView の initWithFrame: メソッドを呼び出す initWithFrame: メソッドを WorkingView に作成できると思いますが、それはハックのように感じます。

これを処理する適切な方法は何ですか?

4

1 に答える 1

0

サブクラスから呼び出した場合[super initWithFrame:frame]、ランタイムは継承階層を上って、そのメソッドを実装するクラスを探し、super から始めます。super が を実装していない場合initWithFrame:、ランタイムは最終的に UIView のデフォルトの実装を見つけて呼び出すまで上昇し続けます。

于 2010-08-28T06:09:17.483 に答える