抽象类中字段的可访问性应该是什么?

时间:2009-08-18 20:14:20

标签: language-agnostic oop abstract-class field

简单地说,作为一个例子,

public abstract class AbstractFellow {

    protected Thing buddy;
....

public class ConcreteFellow extends AbstractFellow {
     public void someMethod() {
          buddy.doSomething();
          //OR
          buddy = somethingElse;
          //OR
          somethingElse = buddy;
     }
}

这是不好的做法吗?

2 个答案:

答案 0 :(得分:1)

意见各不相同。我的观点是,即使在抽象类中,使用私有成员和受保护的访问者(即protected getBuddy())也是一种更好的做法。

它允许始终允许相同的封装:包含在超类中获取“伙伴”对象的逻辑,并允许您在不破坏所有继承类的情况下更改该逻辑。

超类可能也不希望改变buddy。例如,您可能希望取消注册侦听器或在发生这种情况时进行其他清理 - 使用setter方法可以帮助实现该目标。

此外,它显然允许您将Buddy作为只读成员(因为您只能提供getBuddy而不是setBuddy),这是一件不容易实现的事情。成员(你总是可以将它设置为final,但是你也可以阻止超类改变它!)

答案 1 :(得分:1)

这取决于您的域模型以及创建和抽象类的原因。如果你用它定义你的接口,并希望抽象类保留一些功能就可以了。

如果您只是将所有字段设置为受保护,然后在子类中重复使用它们。这取决于,但我认为应该找到更好的方法。对于未来的读者来说,在基类中获取数据及其在子类中的所有行为似乎都不是很清楚。 如果您不需要基类能力来实现方法(并且您不需要在基类中存储任何功能),那么实现与每个子类的接口都是更好的选择。

如果你使用一些基类内部字段,我觉得很自然,没关系。如果您在子类中使用其中一些类似的东西,您可以实现模板方法并享受覆盖您真正需要覆盖的部分。