我有一个像这样的超类,我希望很多类可以继承:
public abstract class Super {
protected Object myField; //Not used anywhere in this class
//a load more code here which does useful stuff
}
所有这些类都需要使用myField
. 但是超类没有。我是否在某个地方做出了错误的设计决定?
我有一个像这样的超类,我希望很多类可以继承:
public abstract class Super {
protected Object myField; //Not used anywhere in this class
//a load more code here which does useful stuff
}
所有这些类都需要使用myField
. 但是超类没有。我是否在某个地方做出了错误的设计决定?
不必要。如果所有子类出于相同的原因需要相同的字段,那么这与在基类中提供任何其他通用功能没有什么不同。随着类的增长,您可能会发现添加了使用该字段的通用功能(例如,在 equals/hashCode 方法中引用它)。
现在,如果该字段的类型是 Object 并且每个子类都将一些完全不同的东西塞入其中,我会认为这是代码异味。
恕我直言,如果该类没有真正使用该字段,则该字段不应出现在该类中。在我看来,你真正想要的是有一个基类来告诉它的子类“你应该都有某种方式来保持 X 的状态,但我(基类)不会修改那个 X 状态,在这种情况下你应该创建一个抽象方法来传达该消息,如下所示:
public abstract class Super {
protected abstract Object getMyField();
}
用这种模糊的描述很难说,但看起来你可以做一些概括并将一些通用代码推到你的超类中。如果您的子类与该字段做类似的事情,那么可以找到一些共性(使用模板方法或策略来处理特定于子类的差异),否则如果每个子类都在做不同的事情,那么使用公共字段有什么意义呢?
不,我不这么认为。抽象类服务于该目的(在基类中具有通用功能,并让子类仅实现特定的必需功能)。
所以,如果你不在课堂上使用那个字段Super
——你为什么需要它呢?
也许您的超类会提供一个接口以通用方式与该字段进行交互,例如:
public abstract class Super<T> {
protected T myField;
public T getField() {
return myField;
}
}
public class Child extends Super<String> {
public Child( String label ) {
super.myField = label;
}
}
只是在一个更轻的音符The only thing common in your hirarchy is one field then you should get rid of abstract class and Create one Marker Interface.