Language agnostic 抽象类中字段的可访问性应该是什么?
简单地说,作为一个例子Language agnostic 抽象类中字段的可访问性应该是什么?,language-agnostic,oop,abstract-class,field,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;
public abstract class AbstractFellow {
protected Thing buddy;
....
public class ConcreteFellow extends AbstractFellow {
public void someMethod() {
buddy.doSomething();
//OR
buddy = somethingElse;
//OR
somethingElse = buddy;
}
}
这是不好的做法吗?意见不一。我的观点是,即使在抽象类中,使用私有成员和受保护的访问器(即
protectedgetbuddy()
)也是一种更好的做法
它允许封装总是允许的事情:包含在超类中获取“buddy”对象的逻辑,并允许您在不破坏所有继承类的情况下更改该逻辑
超级类可能也不希望更改buddy
。例如,您可能希望取消注册侦听器或在发生这种情况时进行其他清理—使用setter方法有助于实现这一点
此外,它显然允许您将Buddy设置为只读成员(因为您只能提供
getBuddy
和nosetBuddy
),这对于一个成员来说并不容易实现(您可以始终将其设置为final
,但是您也可以防止超级类更改它!)这取决于您的域模型以及创建和抽象类的原因。如果您正在用它定义接口,并且希望抽象类保留一些功能,那么它是可以的
如果您只是设置所有受保护的字段,然后在子类中重用它们。这要看情况而定,但我认为应该找到更好的办法。对于您未来的读者来说,获取基类中的数据及其在子类中的所有行为似乎不是很清楚。
如果您不需要实现方法的基类能力(并且不需要在基类中存储任何功能),那么最好实现与这些子类中的每个子类的接口
如果使用一些基类内部字段,我觉得这很自然,也没关系。如果您在子类中使用其中的一些方法来完成类似的事情,您可以实现一个模板方法,并且只覆盖您真正需要覆盖的部分。是的,但这取决于语言。什么取决于语言?在所有OO语言中,这都是正确的。唯一不同的可能是
final
字段修饰符,它可能会以不同的方式调用,也可能根本不存在。我说的是Java,但我认为这个概念足够普遍,可以应用于其他类似的语言。它是-我的答案是一般概念。更具体地说,我在用C#,Objective-C编写时也会这样做,java或C++。