2009-08-18 114 views
0

简单地作为一个例子,抽象类中字段的可访问性应该是什么?

public abstract class AbstractFellow { 

    protected Thing buddy; 
.... 

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

这是不好的做法?

回答

1

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

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

超级类别可能不希望buddy被更改。例如,您可能希望取消注册侦听器,或者在发生这种情况时执行一些其他清理 - 使用setter方法可以实现此目的。

此外,它显然允许您将Buddy作为只读成员(因为您只能提供getBuddy而不能提供setBuddy),这对于使用成员来说并非易事(您可以随时设置它为final,但那么你也阻止超类改变它!)

+0

是的,但它取决于语言。 – jro 2009-08-18 20:26:20

+0

什么取决于语言?在所有OO语言中,这都是事实。唯一不同的可能是'final'字段修饰符,它可能会被调用或根本不存在。 – 2009-08-18 20:29:22

+0

我在谈论Java,但我认为这个概念已经足够普遍适用于其他类似的语言。 – 2009-08-18 20:30:04

1

它取决于你的域模型以及为什么你创建和抽象类。如果你正在为它定义你的接口,并希望抽象类保持一些功能,那么可以。

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

如果你使用一些基类的内部字段,这对我来说似乎很自然,并且没关系。就好像你在你的孩子班中使用其中的一些类似的东西,你可以实现一个模板方法,并享受只覆盖你真正需要覆盖的部分。

相关问题