说我有ClassA
和ClassB
延伸ClassA
ClassA {
private int x;
private void m1()
{
}
}
ClassB extends ClassA {
}
在数据封装下,我们应该私有数据字段和方法。这是对的吗?
但是,在这种情况下,ClassB
无法使用ClassA
的数据字段和方法。
那么,在数据封装下我应该只使用私有访问修饰符吗?
我可以使用受保护的访问修饰符而不是私有来解决数据封装规则下的问题吗?
答案 0 :(得分:2)
基本上,封装是一种确保类中的某些功能仅由经过测试且已知可用的进程运行的方法。如果一个函数没有理由被你想要的任何对象调用,为什么它应该被赋予被看到和意外调用的能力呢?
它实际上是一种程序员控件,设置正确代码使用的规则和基本准则,尤其是在您只希望公开某些函数或类的API场景中。
“良好实践”声明你应该使用'private'来处理与类本身以外的任何东西不相关的函数。对于需要与子类接口的函数,可以使用protected。对于其他类之间的所有其他接口,请使用public。
答案 1 :(得分:1)
没有规则要求所有方法都是私有的。
数据封装通常是指从客户端类隐藏实现的细节。它通常不涉及隐藏所有方法,因为它们是类和该类的客户端类(和/或子类)之间的公共(或者,在某些情况下,继承)契约。私有方法通常用作公共方法的帮助程序,并且保持私有,因为它们的功能 - 也许它们的存在是基于实现的细节。
有时会发布实现的某些细节以供子类使用。这是受保护方法的主要用途。实施数据有时也可能以这种方式暴露出来,但那就是 - 我该如何处理? - 淹没。然而,在严格遵守封装理想和编程实用性之间存在权衡。