有条件地实例化另一个类

时间:2019-05-14 20:57:15

标签: java

假设我有以下课程:

1)动物类,基类

public abstract class Animal {
    public abstract void Hello();
}

2)狗类,是动物类的延伸

public class Dog extends Animal {
    @Override
    public void Hello() {
        System.out.println("I'm Dog");
    }
}

3)狼类,是动物类的延伸

public class Wolf extends Animal {
    @Override
    public void Hello() {
        System.out.println("I'm Wolf");
    }
}

在Dog类的构造函数或newInstance方法中,是否有办法在特定条件下(例如在满月期间)将自身切换/转换为Wolf类?因此,基本上,如果调用者执行以下操作,则变量“ a”将是满月期间的Wolf对象,而不是Dog对象。

Animal a = (Animal) Class.forName("Dog").newInstance();

2 个答案:

答案 0 :(得分:4)

您可以使用Animal的包装器将其委托给您要跟踪的实际Animal;然后在委托包装器中包含一个方法,用于根据您想要的Animal的类名交换委托。这是一个示例类:

public abstract class Animal {

    public abstract String hello();

    static class Dog extends Animal {

        @Override
        public String hello() {
            return "I'm Dog";
        }
    }

    static class Wolf extends Animal {

        @Override
        public String hello() {
            return "I'm Wolf";
        }
    }

    static class AnimalWrapper extends Animal {

        private Animal delegate = new Dog();

        public void delegateTo(String className) throws Exception {
            this.delegate = (Animal) Class.forName(className).newInstance();
        }

        @Override
        public String hello() {
            return delegate.hello();
        }
    }

    public static void main(String[] args) throws Exception {
        AnimalWrapper animal = new AnimalWrapper();
        System.out.println("Animal says: " + animal.hello());
        animal.delegateTo(Wolf.class.getName());
        System.out.println("Animal says: " + animal.hello());
        animal.delegateTo(Dog.class.getName());
        System.out.println("Animal says: " + animal.hello());
    }
}

答案 1 :(得分:2)

您不能那样做。 看起来您需要工厂(用于搜索工厂设计模式)之类的东西来负责创建所需的类的实例。