我有一个像这样的超类我希望很多类继承:
public abstract class Super {
protected Object myField; //Not used anywhere in this class
//a load more code here which does useful stuff
}
所有这些类都需要使用myField
的实例。但是超类没有。我在某个地方做出了糟糕的设计决定吗?
答案 0 :(得分:6)
不一定。如果所有子类都需要相同原因的相同字段,那么这与在基类中提供任何其他常见功能没有什么不同。随着类的增长,您可能会发现添加使用此字段的常用功能(例如,使用equals / hashCode方法引用它)。
现在,如果该字段是Object类型,并且每个子类都将完全不同的东西推入其中,我会认为代码有异味。
答案 1 :(得分:5)
恕我直言,如果一个字段不在该类中,那么该字段不应出现在该类中。在我看来你真正想要的是有一个基类告诉它的子类“你应该有一些方法来保持X的状态,但我(基类)不会修改那个X状态,在这种情况下你应该制作一个抽象的方法来传达这个信息,如下所示:
public abstract class Super {
protected abstract Object getMyField();
}
答案 2 :(得分:3)
很难说这么模糊的描述,但看起来你可以做一些概括并将一些常用代码推送到你的超类中。如果你的子类正在使用字段做类似的事情,那么可以找到一些共性(使用模板方法或策略来处理特定于子类的差异),否则如果每个子类都在做一些不同的事情,那么使用公共字段有什么意义呢?
答案 3 :(得分:2)
不,我不这么认为。抽象类服务于此目的(在基类中具有通用功能,并且子类只实现特定的必需功能)。
答案 4 :(得分:2)
所以,如果你不在班级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;
}
}
答案 5 :(得分:1)
答案 6 :(得分:1)
只需轻松一点The only thing common in your hirarchy is one field then you should get rid of abstract class and Create one Marker Interface.