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

您可以使用工厂方法,例如可以返回任何实现以创建不同实现的静态方法,或者使用委托来委托给实际实现。(构造的类只是一个包装器)

注意:构造函数不会创建实例,它只会初始化为您创建的实例。一旦创建,您就无法更改它的类型。


一种更简单的方法是让一个类检查标志以确定它应该做什么。(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 回答