0


マルチクラスのコンストラクターに渡されたブール条件をチェックしています。真の場合、基本的thisにサブクラスのインスタンスに割り当てようとしています。

もちろんそれは機能しません。この方法でインスタンスをリダイレクトする方法はありますか? これを行う方法がない場合、その理由は何ですか?


マルチクラスは次のとおりです。

public class MultiClass {

    String str;

    public MultiClass(boolean flag) {
        if (flag) {

            // doesn't work! wish it would:
            // this = new ExtraClass();

        } else {
            this.str = "you are in the first class";
        }
    }
} // end of MultiClass

class ExtraClass {

    String str;

    ExtraClass() {
        this.str = "you are in the second class";
    }
} // end of ExtraClass


...そしてテスタークラス:

public class MultiClassTest {

    public static void main(String[] args) {
        MultiClass test = new MultiClass(false);
        System.out.println(test.str);
    }
} // end of MultiClassTest


4

2 に答える 2

3

任意の実装を返すことができる静的メソッドなどのファクトリ メソッドを使用してさまざまな実装を作成するか、委任を使用して実際の実装に委任することができます。(構築されたクラスは単なるラッパーになります)

注: コンストラクターはインスタンスを作成しません。作成されたインスタンスを初期化するだけです。一度作成したタイプは変更できません。


より簡単なアプローチは、フラグをチェックして何をすべきかを判断するクラスを 1 つ持つことです。(ifコード内のステートメントで)

public class MultiClass {
    final String str;

    public MultiClass(boolean flag) {
        if (flag) {
            this.str = "you are in the second class";
        } else {
            this.str = "you are in the first class";
        }
    }
}
于 2013-05-04T06:57:45.833 に答える
0


ピーターがここで提案したように、私は「ファクトリ メソッド」デザイン パターンの使用方法を発見し、後世のためにコードを投稿しています。



以下は、ファクトリ メソッドを持つ親クラスです。

public abstract class Parent {

    /*
     * "factory method" design-pattern:
     */
    public static Parent getInstanceOf(boolean flag) {
        if (flag) {
            return new MultiClass();

        } else {
            return new ExtraClass();
        }
    }
} // end of Parent


...これは、親クラスから拡張されたマルチクラスです。

public class MultiClass extends Parent {

    String str;

    public MultiClass() {
        this.str = "you are in the first class";
    }
} // end of MultiClass

class ExtraClass extends Parent {

    String str;

    ExtraClass() {
        this.str = "you are in the second class";
    }
} // end of ExtraClass


...そして、main メソッドを持つテスター クラスは次のとおりです。

public class MultiClassTest {

    public static void main(String[] args) {

        boolean flag = false; // try changing to true
        Parent test = Parent.getInstanceOf(flag);

        if (test instanceof MultiClass) {
            System.out.println( ((MultiClass)test).str);

        } else if (test instanceof ExtraClass) {
            System.out.println( ((ExtraClass)test).str);
        }
    }
} // end of MultiClassTest



instanceofと明示的なキャストの使用に注意してください。

于 2013-05-05T02:07:53.000 に答える