2012-01-21 100 views
1

我有一个类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级朋友成为朋友,但是我做这件事有点不舒服。是否有任何模式或可接受的技术(不是黑客请求)来实现此访问限制? 谢谢,我很抱歉,如果这是重复的。

回答

1

C++中的类被创建为friend s,以表示类之间特殊的有意识的强耦合。这种使用friend infact增强封装,而不是打破它可能是流行的感觉。
如何?
如果没有友谊,将功能展示给其他类的唯一非破解方法是提供public,getset成员函数,这实际上破坏了封装,因为所有类(即使不需要的类)现在都可以访问对这些方法,因此成员会增加潜在破坏类数据的风险。回到你的情况,如果你有100个班级需要访问这个特定的班级,那么你已经有了正确的设计,通过使用这些方法为public。现在试图让这些方法private到未来的类是试图破解你现有的设计,你的设计不支持它。

将现有类作为friend s并不理想地符合上述标准,因此不适合该场景。
但是,考虑到这种情况,您无法通过其他方式实现此目的。将现有的课程设置为friend并授予他们特殊访问权似乎是唯一的方法。这仍然是不好的,因为只有少数方法的100个类现在可以访问你的整个类。

+1

他可以声明只有一些方法,如“朋友”,而不是整个类。 – Idov

+0

@Idov:哦是的,如果只有这100个类中的特定方法需要访问,那么OP可以做到这一点。在这种情况下,我说的最后一点不适用。但是我不确定什么是确切的情况,我引用了最坏的情况。 –

+0

@Idov:非常感谢。如果我正确地理解了你,(不同类的)调用者方法应该被声明为朋友。我在一个测试程序中尝试了它,它工作。非常感谢你。可以将一个类中的几个方法(在这种情况下,它是A)声明为朋友并且是私有的,以便朋友类方法除了公共接口之外只能访问它们? – user917279

0

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

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

因此,如果您需要(复制)构建类,或者像这样运行,但是我不能在不知道类的用法的情况下现在就说它不可用。

而且,你会得到一个小的开销,由于virtual功能