抽象类中受保护的数据

cvs*_*ave 14 java protected abstract

我的问题涉及专门的Java,抽象类和受保护数据的使用.我被告知所有数据都应该是私有的,并且仅使用受保护的getter/setter.

现在,我理解我们希望屏蔽数据,使其免受该类临时用户的直接操作,并且公共数据成员通常是一个值得怀疑的做法.我已经看过"Java protected fields vs public getters"(Java protected fields vs public getters),但我仍然怀疑:

protected int i;  
Run Code Online (Sandbox Code Playgroud)

在抽象类中比在以下情况更糟糕:

private int i;  
protected int geti();  
protected void seti(int j); 
Run Code Online (Sandbox Code Playgroud)

当抽象类准确地为子类提供父/公共设施时,我只是没有看到缺点,受保护的范围旨在提供对子项的访问,同时保护数据免受临时用户的影响.我在上面提到的问题中指出,大多数答案似乎都解决了为什么数据一般应该是私有而不是公开的问题.我试图将我的问题专门集中在一个抽象的父母中存在的数据,供孩子们使用.我迄今听到的唯一合理的评论是,使用父母受保护的数据(例如,上面的int i)会在子类中留下引用未在子类中声明的变量的代码.参数不太引人注目(参见基类中的Common protected data成员?)您可能希望某天更改访问权限,现在您必须尊重您的界面.这是一个抽象类,旨在100%扩展.

谢谢!特定标题/页面对书籍的引用对于引用"..anyany basic Java programming text ..."更有帮助.

========================================== 10-13-2010
这是关于抽象类的问题,因为它是关于受保护的数据.我觉得令人失望的是,在OOP中数据隐藏是否是一件好事的回答似乎已经转移(答案:是).这里有很多深度涉及抽象类的本质,以及它与常规非final类的区别,以及可能有哪些可能的优点来修复抽象父类中的数据项的名称和类型以供使用儿童班.我认为这里存在创新和更大控制从抽象父类扩展到实现子类的可能性.我担心一般原则,例如数据隐藏的优势,可能成为教条,并抑制创新和新模式和想法的发展.

感谢所有贡献者.

ale*_*lex 11

如果该字段是私有的并且通过getter和setter进行访问,则您将能够重新实现getter和setter(例如,删除字段并从外部源更新/读取值),从而更改"字段"的工作方式没有接触任何儿童课程.

这是否值得,这取决于你.

  • 好吧,除了在其他答案中提到的一些小的包可见性细节之外,我相信这是使一个字段与受保护的getter和setter私有的唯一论据.就个人而言,我认为它也不是非常引人注目...... Java中的Getters和setter很烦人. (2认同)

Kea*_*eks 9

将受保护的方法视为子类的接口,就像公共方法是其他所有人的接口一样.

提供访问器使基类能够维持其状态:如果没有故意的技巧,子类就不会破坏它.

  • 作为抽象的基类可以没有状态,因为它无法实现.我想这是我推理的一部分; sdame ruloes不一定适用于具体父级的抽象父级.在这种情况下,我认为引入界面的想法可能会分散注意力,尽管这是一个有趣的想法.谢谢你的评论. (2认同)