実装は、抽象クラスと具象クラスに分割する必要があります。Template Method パターンを使用してそれを行うことができます。
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;
}
}