我的问题具体涉及 Java、抽象类和 protected 数据的使用。我被告知所有数据都应该是私有(private)的,并且只使用 protected getter/setter。
现在,我明白我们想要保护数据免受类的临时用户的直接操作,而公共(public)数据成员通常是一种有问题的做法。我看过“Java protected fields vs public getters”(Java protected fields vs public getters),但我仍然怀疑:
protected int i;
在抽象类中比:
private int i;
protected int geti();
protected void seti(int j);
当抽象类恰好为子类提供父/公共(public)设施时,我只是没有看到不利的一面,而 protected 范围旨在为子类提供访问,同时保护数据免受临时用户的影响。我在上面提到的问题中注意到,大多数答案似乎都解决了为什么数据通常应该是私有(private)的而不是公共(public)的问题。我试图将我的问题特别集中在抽象 parent 中存在的供 child 使用的数据上。迄今为止我听到的唯一合理的评论是,使用 protected 父数据(例如,上面的 int i)会在子类中留下引用未在子类中声明的变量的代码。不太令人信服的论点(请参阅 Common protected data member in base class?)您可能希望有一天更改访问权限,现在您必须尊重您的界面。这是一个抽象类,旨在 100% 的时间进行扩展。
谢谢!对书籍的特定标题/页码引用比对“..任何基本 Java 编程文本...”的引用更有帮助
==========================================10-13-2010
这既是关于抽象类的问题,也是关于 protected 数据的问题。我发现令人失望的是,焦点似乎已经转移到对数据隐藏在 OOP 中是否是一件好事的回应中(答案:是的)。这里有很多深度涉及抽象类的性质,以及它与常规非最终类的不同之处,以及在抽象父类中固定数据项的名称和类型以供使用的可能优势 child 类。我认为这里有可能将创新和更大的控制从抽象父类向下扩展到实现子类。我担心数据隐藏的优势等一般原则会成为教条,抑制创新和新模式和想法的发展。
感谢所有做出贡献的人。
最佳答案
如果该字段是私有(private)的并且通过 getter 和 setter 进行访问,您将能够重新实现 getter 和 setter(例如,删除该字段并从外部源更新/读取值),从而改变“field"在不接触任何子类的情况下工作。
这是否值得,这取决于你。
关于java - 抽象类中的 protected 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3525765/