限制对类方法的访问

时间:2012-01-21 15:36:42

标签: c++ oop private encapsulation

我有一个A类,它有公共方法,并被不同应用程序中实现的100个其他类使用。现在我想将这些公共方法设置为私有,以便没有新类访问它们,但我希望现有的客户端类仍然可以访问它们。 但我不想触及那些客户端类,因为业主很少允许他们的课程中出现任何涟漪。

我检查了

Can I access private members from outside the class without using friends?

C++: Is there a way to limit access to certain methods to certain classes without exposing other private members?

friend class with limited access

但是所有(并非所有)都要求改变客户端的代码。客户端代码不应更改。

一个直截了当的方法就是让所有N级朋友成为朋友,但我有点不自在。是否有任何模式或可接受的技术(请不是黑客)来实现此访问限制? 谢谢你,如果这是重复,我道歉。

2 个答案:

答案 0 :(得分:1)

使用C ++中的类friend来表示类之间特殊的有意强耦合。这种friend infact的使用增强了封装,而不是将其打破,这可能是流行的感觉 怎么样?
没有友谊,将功能暴露给其他类的唯一非黑客方式是提供publicgetset成员函数,这实际上打破了封装,因为所有类(甚至那些谁不需要)现在可以访问这些方法,因此成员增加了潜在破坏类数据的风险。

回到你的情况,如果你有100个需要访问这个特定类的类,那么通过将这些方法设置为public,你已经就地设置了正确的设计。现在尝试将这些方法private用于未来的类是试图破解现有设计,您的设计不支持它。

将现有的课程设为friend并不符合上述标准,因此不适合该情景。
但是,鉴于这种情况,没有其他方法可以实现这一点。将现有类设为friend并授予它们特殊访问权限似乎是唯一的方法。这仍然很糟糕,因为只有少数方法可以访问的100个类现在可以访问整个类。

答案 1 :(得分:0)

我认为您可以提取A类的接口(让它为IA)并使A实现IA。您根本不应在IA中定义这些公共方法。

然后,旧代码将继续使用A并且可以访问A个公共方法,而新代码将使用受限制的接口,该代码将通过某种结构接收。

原因是,如果你需要(复制)构造类,或者像这样的smth,这可能是不可实现的,但是我不能在不知道类的用法的情况下现在就说出来。

此外,由于virtual函数

,您会得到一点开销