我有一个抽象超类和一些派生类。
我想创建一个方法
createNew()
在派生类上调用时,它将创建派生类的新实例,并带有其所有成员的智能副本。
所有对创建很重要的成员都在抽象类中,因此代码应相同。
我可以在超类中编写createNew()的实现吗?
这样的东西
SonA sonA2 = sonA1.createNew()
SonB sonB2 = sonB1.createNew()
Abs超类应该执行实现,因为代码是相同的。
谢谢。
最佳答案
实现应在抽象类和具体类之间划分。您可以使用“模板方法”模式进行操作:
public abstract class AbstractSon {
protected abstract AbstractSon createNewImpl();
public AbstractSon createNew() {
AbstractSon res = createNewImpl();
res.name = "default name";
return res;
}
}
public class Son1 extends AbstractSon {
protected AbstractSon createNewImpl() {
return new Son1();
}
}
public class Son2 extends AbstractSon {
protected AbstractSon createNewImpl() {
return new Son2();
}
}
您可以不同地划分责任以获得准确的回报类型:
public abstract class AbstractSon {
protected void prepare(AbstractSon toPrepare) {
toPrepare.name = "default name";
}
}
public class Son1 extends AbstractSon {
public Son1 createNew() {
Son1 res = new Son1();
prepare(res);
return res;
}
}
public class Son2 extends AbstractSon {
public Son2 createNew() {
Son2 res = new Son2();
prepare(res);
return res;
}
}
关于java - 需要Java继承设计技巧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10517672/