是一个超类保护字段,它只用于子类的坏习惯吗?

时间:2012-09-06 14:07:07

标签: java

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

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

所有这些类都需要使用myField的实例。但是超类没有。我在某个地方做出了糟糕的设计决定吗?

7 个答案:

答案 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)

this tuturial

中所述
  

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

这意味着受保护的字段已经精确设计为具有这些特征。

答案 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.