简单地说,作为一个例子,
public abstract class AbstractFellow {
protected Thing buddy;
....
public class ConcreteFellow extends AbstractFellow {
public void someMethod() {
buddy.doSomething();
//OR
buddy = somethingElse;
//OR
somethingElse = buddy;
}
}
这是不好的做法吗?
答案 0 :(得分:1)
意见各不相同。我的观点是,即使在抽象类中,使用私有成员和受保护的访问者(即protected getBuddy()
)也是一种更好的做法。
它允许始终允许相同的封装:包含在超类中获取“伙伴”对象的逻辑,并允许您在不破坏所有继承类的情况下更改该逻辑。
超类可能也不希望改变buddy
。例如,您可能希望取消注册侦听器或在发生这种情况时进行其他清理 - 使用setter方法可以帮助实现该目标。
此外,它显然允许您将Buddy作为只读成员(因为您只能提供getBuddy
而不是setBuddy
),这是一件不容易实现的事情。成员(你总是可以将它设置为final
,但是你也可以阻止超类改变它!)
答案 1 :(得分:1)
这取决于您的域模型以及创建和抽象类的原因。如果你用它定义你的接口,并希望抽象类保留一些功能就可以了。
如果您只是将所有字段设置为受保护,然后在子类中重复使用它们。这取决于,但我认为应该找到更好的方法。对于未来的读者来说,在基类中获取数据及其在子类中的所有行为似乎都不是很清楚。 如果您不需要基类能力来实现方法(并且您不需要在基类中存储任何功能),那么实现与每个子类的接口都是更好的选择。
如果你使用一些基类内部字段,我觉得很自然,没关系。如果您在子类中使用其中一些类似的东西,您可以实现模板方法并享受覆盖您真正需要覆盖的部分。