我有一个类动物,它有两个子类Cat和Dog。我想写一个复制方法。既然Cats and Dogs都会重现,那么这种方法应该放在动物身上,显然猫只应该生产猫等等。所以在超级类动物中我有类似的东西:
public void Reproduce(){
addAnimal(new Type);
}
其中Type表示我们想要制作另一个的类(所以猫或狗)。当然,我想编写代码,以便以后可以添加其他类别的动物,如马或其他东西。所以我想要的是这样的:
public void Reproduce(){
addAnimal(new this);
}
这样cat.Reproduce()将启动类Cat的新实例,而dog.Reproduce()将实例化一个新的Dog等。
有办法做到这一点吗?或者有没有办法让方法检索调用它的实例的类类型,然后实例化一个新类型?
编辑:为了更清楚,我找到了一些不同的方法来找出当前的类,例如this.getClass();.但是,我还没有找到一种方法来使用该信息来创建相同类型的新类。做这样的事情:
Class c = this.getClass();
Animals offspring = new c;
不起作用。
答案 0 :(得分:1)
有两种选择。首先是让你的类实现像这样的Cloneable
接口
class Cat implements Cloneable {
// all your properties and methods
@Override
public Cat clone() throws CloneNotSupportedException {
return (Cat)super.clone(); // if you need deep copy you might write your custom code here
}
public void Reproduce(){
Cat c = this.clone();
// change some properties of object c if needed
addAnimal(c);
}
}
第二个选项是使用反射(您可能需要在反射的使用周围添加try{} catch()
块)
public void Reproduce() {
Constructor c = tc.getClass().getDeclaredConstructor(String.calss, Integer.class); //pass types of parameters as in consrtuctor you want to use. In
//this case I assume that Cat class has constructor with first parameter of type String and second parameter of type Integer
Cat cat = (Cat)c.newInstance("someString", 2);
// change some properties of object c if needed
addAnimal(cat);
}