gpt4 book ai didi

java - 在 Java 抽象类中创建新对象

转载 作者:搜寻专家 更新时间:2023-10-31 19:40:26 28 4
gpt4 key购买 nike

我有两个使用非常相似方法的对象,除了一行。例如:

public class Cat extends Animal
public class Dog extends Animal

并且它们都在抽象类Animal 中使用了breed 方法。一个调用 new Dog(),另一个调用 new Cat()。现在我只是在 Animal 中将它声明为 abstract public void breed();,但是有没有一种方法可以概括它,这样我就不必使它成为一个被覆盖的抽象方法?

最佳答案

有很多方法可以做到这一点,假设通过 breed你的意思是“为我创造 child 。”

反射

首先是使用反射。如果你的类有一个无参数的构造函数,这就像调用 Class.newInstance 一样简单。 :

public Animal breed() {
try {
return (Animal) getClass().newInstance();
} catch (Exception ex) {
// TODO Log me
return null;
}
}

如果您的所有子类中都没有无参数构造函数,则您必须在所有子类中使用统一的构造函数。例如,如果您有 Cat(int, String)Dog(int, String) , 然后你需要通过 Class.getConstructor 获取构造函数并调用 newInstance 对此:

return (Animal) getClass().getConstructor(int.class, String.class).newInstance(0, "Unnamed");

intString例如,这里可能是年龄和姓名。这就是您如何通过反射(reflection)来做到这一点。

提供商

另一种方法是使用这个简单的界面:

public interface Provider<T> {
T create();
}

然后让你的抽象类在它的构造函数中获取一个这样的实例:

public abstract class Animal {
private final Provider<Animal> animalProvider;

protected Animal( ... , Provider<Animal> animalProvider) {
// ...
this.animalProvider = animalProvider;
}

public Animal breed() {
return animalProvider.create();
}
}

然后你的子类将传递一个 Provider<Animal>到将创建子类的新实例的父类(super class):

public class Dog extends Animal {
public Dog( ... ) {
super( ... , new DogProvider());
// ...
}

private static class DogProvider implements Provider<Animal> {
public Animal create() {
return new Dog( ... );
}
}
}

对其他子类也做同样的事情。

注意:如果通过 breed你的意思是“了解我的类型”,那么你应该编辑你的问题来这样说。如果这是您的意思,那么这是一个可行的解决方案:

public abstract class Animal {
protected final Breed breed;

protected Animal( ... , Breed breed) {
// ...
this.breed = breed;
}

public Breed getBreed() {
return breed;
}
}

我建议遵循 get/set数据容器方法的约定。 Java 具有用于处理这些命名约定的 bean 类,并且它或多或少是跨许多平台的标准。对于你的子类:

public class Dog extends Animal {
public Dog( ... ) {
super( ... , new Breed( ... ));
// ...
}
}

关于java - 在 Java 抽象类中创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546516/

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