简单地作为一个例子,
public abstract class AbstractFellow {
protected Thing buddy;
....
public class ConcreteFellow extends AbstractFellow {
public void someMethod() {
buddy.doSomething();
//OR
buddy = somethingElse;
//OR
somethingElse = buddy;
}
}
这是不好的做法?
众说纷纭。 我的看法是,即使在抽象类,使用私有成员和受保护的存取(即protected getBuddy()
是一个更好的做法。
它允许同样的事情总是封装允许:包含在获得超一流的“哥们”的对象,并允许您更改逻辑没有打破所有继承类的逻辑。
超类可能没有想到buddy
改变,无论是。 例如,您可能要注销听众或做一些其他清理这种情况发生的时候 - 有setter方法有助于实现这一目标。
此外,它显然可以让你有好友为只读成员(因为你可以只提供一个getBuddy
并没有setBuddy
),这东西是不容易用一个成员来完成(你总是可以将其设置为final
,但你避免超一流更改它,太!)
这取决于你的域模型,为什么你创建和抽象类。 如果要定义与它的接口,并希望抽象类保留一些功能它了确定。
如果你是刚刚设置保护的所有字段,然后重复使用它们在你的子类。 那么这取决于,但我认为更好的办法应该可以找到。 它似乎不是很清楚你的未来读者在基类中获取数据和所有它的子类中的行为。 如果您不需要实现方法基类的能力(而你并不需要保存在你的基类的任何功能)也许it`sa更好的选择,以实现一个接口,每这些子类。
如果你使用一些基本的类内场的他很自然地我和它的确定。 只是,如果你使用的是一些人在你的孩子类类似的事情,你可以实现一个模板方法,并与覆盖只有你真正需要重写的部分享受。