gpt4 book ai didi

java - 有条件地实例化不同的类

转载 作者:行者123 更新时间:2023-12-02 07:52:19 24 4
gpt4 key购买 nike

假设我有以下类(class):

1) Animal类,基类

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

2)Dog类,继承自Animal类

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

3) Wolf 类,继承自 Animal 类

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();

最佳答案

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

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());
}
}

Complete code on GitHub

关于java - 有条件地实例化不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56138494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com