5

我有一个像这样的超类,我希望很多类可以继承:

public abstract class Super {
    protected Object myField; //Not used anywhere in this class
    //a load more code here which does useful stuff
}

所有这些类都需要使用myField. 但是超类没有。我是否在某个地方做出了错误的设计决定?

4

7 回答 7

6

不必要。如果所有子类出于相同的原因需要相同的字段,那么这与在基类中提供任何其他通用功能没有什么不同。随着类的增长,您可能会发现添加了使用该字段的通用功能(例如,在 equals/hashCode 方法中引用它)。

现在,如果该字段的类型是 Object 并且每个子类都将一些完全不同的东西塞入其中,我会认为这是代码异味。

于 2012-09-06T14:09:03.263 回答
5

恕我直言,如果该类没有真正使用该字段,则该字段不应出现在该类中。在我看来,你真正想要的是有一个基类来告诉它的子类“你应该都有某种方式来保持 X 的状态,但我(基类)不会修改那个 X 状态,在这种情况下你应该创建一个抽象方法来传达该消息,如下所示:

public abstract class Super {
    protected abstract Object getMyField();
}
于 2012-09-06T14:14:30.753 回答
3

用这种模糊的描述很难说,但看起来你可以做一些概括并将一些通用代码推到你的超类中。如果您的子类与该字段做类似的事情,那么可以找到一些共性(使用模板方法或策略来处理特定于子类的差异),否则如果每个子类都在做不同的事情,那么使用公共字段有什么意义呢?

于 2012-09-06T14:12:06.167 回答
2

不,我不这么认为。抽象类服务于该目的(在基类中具有通用功能,并让子类仅实现特定的必需功能)。

于 2012-09-06T14:09:40.883 回答
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;
    }
}
于 2012-09-06T14:15:20.767 回答
1

只是在一个更轻的音符The only thing common in your hirarchy is one field then you should get rid of abstract class and Create one Marker Interface.

于 2012-09-06T15:02:05.157 回答
1

本教程所述

类本身、其子类和同一包中的类可以访问受保护的字段或方法。

这意味着受保护区域的设计精确地具有这些特性。

于 2012-09-06T14:13:30.083 回答