【问题标题】:Restricting access to methods of a class限制对类方法的访问
【发布时间】:2012-02-15 18:35:35
【问题描述】:

我有一个 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 个班级成为朋友,但我有点不舒服。是否有任何模式或可接受的技术(请不要破解)来实现此访问限制? 谢谢,如果这是重复的,我深表歉意。

【问题讨论】:

    标签: c++ oop private encapsulation


    【解决方案1】:

    C++ 中的类被命名为friends,以表明类之间的特殊故意强耦合。这种friend 的使用实际上增强了封装,而不是像流行的感觉那样破坏它。
    怎么样?
    没有友谊,向其他类公开功能的唯一非黑客方式是提供public、get 和set 成员函数,这实际上破坏了封装,因为所有类(即使是那些不需要) 现在可以访问这些方法,因此成员增加了可能破坏类数据的风险。

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

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

    【讨论】:

    • 他只能将一些方法声明为“朋友”,而不能声明整个类。
    • @Idov:哦,是的,如果只有这 100 个类中的特定方法需要访问,那么 OP 肯定可以做到这一点。在那种情况下,我说的最后一点不适用。但是我不确定确切的情况是什么,我引用了最坏的情况。
    • @Idov:非常感谢。如果我理解正确,调用者方法(不同类的)应该被声明为朋友。我在一个测试程序中进行了尝试,并且成功了。非常感谢。一个类中的一些方法(在这种情况下是 A )是否可以声明为朋友但又是私有的,以便朋友类方法除了公共接口之外只能访问它们吗?
    • @user917279: 是的,方法可以在自己的类中声明为private,也可以声明为其他类的friend。
    【解决方案2】:

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

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

    当然,如果您需要(复制)构造类或类似的东西,这可能无法实现,但我现在不能在不知道类的用法的情况下说出来。

    此外,由于virtual 函数,您会获得一些开销

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 1970-01-01
      • 2014-10-04
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多