我有一个A类,它有公共方法,并被不同应用程序中实现的100个其他类使用。现在我想将这些公共方法设置为私有,以便没有新类访问它们,但我希望现有的客户端类仍然可以访问它们。 但我不想触及那些客户端类,因为业主很少允许他们的课程中出现任何涟漪。
我检查了
Can I access private members from outside the class without using friends?
friend class with limited access
但是所有(并非所有)都要求改变客户端的代码。客户端代码不应更改。
一个直截了当的方法就是让所有N级朋友成为朋友,但我有点不自在。是否有任何模式或可接受的技术(请不是黑客)来实现此访问限制? 谢谢你,如果这是重复,我道歉。
答案 0 :(得分:1)
使用C ++中的类friend
来表示类之间特殊的有意强耦合。这种friend
infact的使用增强了封装,而不是将其打破,这可能是流行的感觉
怎么样?
没有友谊,将功能暴露给其他类的唯一非黑客方式是提供public
,get
和set
成员函数,这实际上打破了封装,因为所有类(甚至那些谁不需要)现在可以访问这些方法,因此成员增加了潜在破坏类数据的风险。
回到你的情况,如果你有100个需要访问这个特定类的类,那么通过将这些方法设置为public
,你已经就地设置了正确的设计。现在尝试将这些方法private
用于未来的类是试图破解现有设计,您的设计不支持它。
将现有的课程设为friend
并不符合上述标准,因此不适合该情景。
但是,鉴于这种情况,没有其他方法可以实现这一点。将现有类设为friend
并授予它们特殊访问权限似乎是唯一的方法。这仍然很糟糕,因为只有少数方法可以访问的100个类现在可以访问整个类。
答案 1 :(得分:0)
我认为您可以提取A
类的接口(让它为IA
)并使A
实现IA
。您根本不应在IA
中定义这些公共方法。
然后,旧代码将继续使用A
并且可以访问A
个公共方法,而新代码将使用受限制的接口,该代码将通过某种结构接收。
原因是,如果你需要(复制)构造类,或者像这样的smth,这可能是不可实现的,但是我不能在不知道类的用法的情况下现在就说出来。
此外,由于virtual
函数