抽象类中的受保护数据

2022-09-02 21:15:45

我的问题特别涉及Java,抽象类和受保护数据的使用。我被告知所有数据都应该是私有的,并且仅使用受保护的getters/setters。

现在,我明白了,我们希望保护数据免受该类的临时用户的直接操纵,并且公共数据成员通常是一种可疑的做法。我已经看过“Java受保护字段与公共获取器”(Java受保护字段与公共获取器),但我仍然怀疑:

protected int i;  

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

private int i;  
protected int geti();  
protected void seti(int j); 

我只是没有看到缺点,因为抽象类正好在那里为子类提供父/公共工具,而受保护的范围旨在提供对子类的访问,同时保护数据免受临时用户的侵害。我注意到,在上面提到的问题中,大多数答案似乎都解决了为什么一般数据应该是私有的而不是公开的问题。我试图将我的问题特别关注抽象父母中存在的数据,供孩子使用。到目前为止,我听到的唯一合理的评论是,使用父级受保护的数据(例如,上面的int i)会给您留下子类中的代码,这些代码引用了子类中未声明的变量。不太令人信服的论点(请参阅基类中的常见受保护数据成员?),即您可能希望有一天更改访问权限,现在您必须遵守您的接口。这是一个抽象类,旨在 100% 扩展。

谢谢!对书籍的特定标题/页码#引用比引用“..”更有用。任何基本的 Java 编程文本...”

========================================== 10-13-2010
这既是一个关于受保护数据的问题,也是一个关于抽象类的问题。我发现令人失望的是,焦点似乎已经转移到了数据隐藏在OOP中是否是一件好事的响应中(答案:是的)。这里有很多深度涉及抽象类的性质,它与常规的非最终类有何不同,以及修复抽象父级中数据项的名称和类型以供子类使用可能有哪些优势。我认为这里有可能将创新和更大的控制从抽象的父类扩展到实现子类。我担心的是,一般原则,例如数据隐藏的优势,可能会成为教条,并抑制创新和新模式和新思想的发展。

感谢所有做出贡献的人。


答案 1

如果字段是私有的,并且通过 getter 和 setter 进行访问,您将能够重新实现 getter 和 setter(例如,删除字段并从外部源更新/读取值),从而在不接触任何子类的情况下更改“字段”的工作方式。

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


答案 2

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

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


推荐