假设我有以下课程:
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();
答案 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)
您不能那样做。 看起来您需要工厂(用于搜索工厂设计模式)之类的东西来负责创建所需的类的实例。