【发布时间】:2016-04-09 07:52:06
【问题描述】:
我想在一个抽象超类的构造函数中调用一个抽象方法generateId(),这个抽象方法依赖于各个子类的一些字段。为了清楚起见,请考虑以下代码:
抽象类:SuperClass
public abstract class SuperClass {
protected String id;
public SuperClass() {
generateId();
}
protected abstract void generateId();
}
子类:Sub1
public class Sub1 extends SuperClass {
private SomeType fieldSub1;
public Sub1(SomeType fieldSub1) {
this.fieldSub1 = fieldSub1;
super();
}
protected void generateId() {
// Some operations that use fieldSub1
}
}
子类:Sub2
public class Sub2 extends SuperClass {
private SomeOtherType fieldSub2;
public Sub2(SomeOtherType fieldSub2) {
this.fieldSub2 = fieldSub2;
super();
}
protected void generateId() {
// Some operations that use fieldSub2
}
}
但是,子类构造函数不起作用,因为super(); 必须是构造函数中的第一条语句。
OTOH,如果我在子类的构造函数中将super(); 设为第一条语句,那么我将无法在SuperClass 中调用generateId()。因为generateId()使用子类中的字段,这些字段在使用前必须先初始化。
在我看来,“解决”这个问题的唯一方法是:删除超类中对generateId() 的调用。在 each 子类的构造函数末尾调用generateId()。但这会导致代码重复。
那么有什么方法可以在不复制我的代码的情况下解决这个问题? (也就是说,没有在each子类的构造函数末尾调用generateId()?)
【问题讨论】:
-
如果你让
SomeType和SomeOtherType有一个共同的父级,然后将ParentType传递给SuperClass构造函数呢? -
@Arc676 我无法想象它。你能发布一个包含代码的答案吗?
-
您可能想检查这个问题:stackoverflow.com/questions/3404301/…。简单地说:不要在构造函数中使用可覆盖的方法。
-
您能解释一下您的具体问题是什么吗?我想这可能是XY-Problem。
-
@Utku 为什么必须在初始化时生成 id?为什么第一次使用id时不能及时计算id?
标签: java oop inheritance