我一直对大多数 OOP 语言(或者更确切地说,C++)让你在接口(interface)中定义私有(private)方法/成员这一事实感到困惑(我所说的接口(interface)是指类声明 - 似乎我很困惑)。这不是展示了类的实现细节,违背了封装的思想吗?
我错过了这个有充分的理由吗?
最佳答案
对于 C++,这是一个实现问题。
C++ 编译器必须能够通过只查看类声明而不是实现来生成使用类的代码。编译器需要的一件非常重要的事情是类实例的大小,因为除其他外,C++ 通过嵌入而不是通过存储对单独对象的引用来处理对象中的子对象。为了能够构建一个对象(例如 struct X { Y y; Z z; }
)所有子对象的大小(例如 Y
和 Z
) 必须提前知道。
解决此问题的方法是使用 the "pimpl" pattern (also named the "compiler firewall" pattern)这使您可以对类(class)的用户隐藏所有内部细节。不幸的是,这会带来一些运行时的额外成本,但大多数时候它是微不足道的。使用这种方法,公共(public)对象将始终具有指针的大小,并且将使用额外的间接访问实例中的所有数据......优点是您可以添加私有(private)数据成员,并且该类的用户不需要被重新编译(如果你的类在一个 DLL 中,这允许保持二进制兼容性)。
能够在实现部分仅声明私有(private)方法(无数据)是可能的,而不会增加编译器的复杂性,但 C++ 设计者认为最好为一个类保留一个声明。
实际上,即使只是添加一个私有(private)方法也可能会影响许多实现中类实例的大小(例如,如果私有(private)方法是类中唯一的虚拟方法)。
关于c++ - 为什么在接口(interface)中定义私有(private)成员/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7344054/