Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 抽象类中字段的可访问性应该是什么?_Language Agnostic_Oop_Abstract Class_Field - Fatal编程技术网

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
和no
setBuddy
),这对于一个成员来说并不容易实现(您可以始终将其设置为
final
,但是您也可以防止超级类更改它!)

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

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


如果使用一些基类内部字段,我觉得这很自然,也没关系。如果您在子类中使用其中的一些方法来完成类似的事情,您可以实现一个模板方法,并且只覆盖您真正需要覆盖的部分。

是的,但这取决于语言。什么取决于语言?在所有OO语言中,这都是正确的。唯一不同的可能是
final
字段修饰符,它可能会以不同的方式调用,也可能根本不存在。我说的是Java,但我认为这个概念足够普遍,可以应用于其他类似的语言。它是-我的答案是一般概念。更具体地说,我在用C#,Objective-C编写时也会这样做,java或C++。