C++ 限制对特定类的方法调用

C++ 限制对特定类的方法调用,c++,encapsulation,C++,Encapsulation,我有一个类,它可以实现doAction(),还可以实现接口(接口不包括doAction)。A工作正常,因此我希望尽量减少A中的更改。现在我想添加新状态并创建类AExt,该类现在负责生成doAction(),该类更改状态,现在取决于状态。目标是限制doAction(),以便只能由AExt调用它,因为不从AExt调用::doAction将破坏该功能。同时AExt只使用A的公共接口 我可以将doAction()设置为私有,并使A成为AExt的朋友,但我不喜欢这样,因为这样会将A的所有内部内容暴露给AE

我有一个类,它可以实现doAction(),还可以实现接口(接口不包括doAction)。A工作正常,因此我希望尽量减少A中的更改。现在我想添加新状态并创建类AExt,该类现在负责生成doAction(),该类更改状态,现在取决于状态。目标是限制doAction(),以便只能由AExt调用它,因为不从AExt调用::doAction将破坏该功能。同时AExt只使用A的公共接口

  • 我可以将doAction()设置为私有,并使A成为AExt的朋友,但我不喜欢这样,因为这样会将A的所有内部内容暴露给AExt
  • 我可以将doAction()设为虚拟,并从相同的问题继承AExt。此外,(很可能)会有一位继任者不想知道是否存在A或AExt
  • 我可以对A和AExt使用相同的接口并使用Decorator模式,但我不喜欢这样,因为A有许多AExt不需要的附加方法(所有接口),而A的客户机需要它们
  • 我可以用下面的作文 但这不会阻止从外部调用::doAction()

    类AExt { 公众: void doAction(){m_a.doAction();…} A&getA(){return m_A;} }


  • <>建议?

    < P>弗拉德,C++没有提供你想要的细粒度。你的方法1-4基本上是正确的。尝试将这样的精细细节添加到C++中会导致更复杂的语言。有人说C++已经太复杂了。这意味着语言设计是一种表达能力和保持其合理简单的愿望之间的权衡


    我要声明你的
    doAction()受保护。这将禁止从任意代码段调用它。同时,
    AExt
    似乎是您自己的类。如果它能够完全访问它的父对象,那么它可能并没有那么糟糕。从各方面来看,这个解决方案并不完美。它的主要优点是简单。我建议您不要在没有充分理由的情况下使代码过于复杂。代码的简洁明了也是重要的。

    < P>弗拉德,C++没有提供您想要的细粒度。你的方法1-4基本上是正确的。尝试将这样的精细细节添加到C++中会导致更复杂的语言。有人说C++已经太复杂了。这意味着语言设计是一种表达能力和保持其合理简单的愿望之间的权衡


    我要声明你的
    doAction()受保护。这将禁止从任意代码段调用它。同时,
    AExt
    似乎是您自己的类。如果它能够完全访问它的父对象,那么它可能并没有那么糟糕。从各方面来看,这个解决方案并不完美。它的主要优点是简单。我建议您不要在没有充分理由的情况下使代码过于复杂。代码的简洁明了也是重要的。

    < P>弗拉德,C++没有提供您想要的细粒度。你的方法1-4基本上是正确的。尝试将这样的精细细节添加到C++中会导致更复杂的语言。有人说C++已经太复杂了。这意味着语言设计是一种表达能力和保持其合理简单的愿望之间的权衡


    我要声明你的
    doAction()受保护。这将禁止从任意代码段调用它。同时,
    AExt
    似乎是您自己的类。如果它能够完全访问它的父对象,那么它可能并没有那么糟糕。从各方面来看,这个解决方案并不完美。它的主要优点是简单。我建议您不要在没有充分理由的情况下使代码过于复杂。代码的简洁明了也是重要的。

    < P>弗拉德,C++没有提供您想要的细粒度。你的方法1-4基本上是正确的。尝试将这样的精细细节添加到C++中会导致更复杂的语言。有人说C++已经太复杂了。这意味着语言设计是一种表达能力和保持其合理简单的愿望之间的权衡


    我要声明你的
    doAction()受保护。这将禁止从任意代码段调用它。同时,
    AExt
    似乎是您自己的类。如果它能够完全访问它的父对象,那么它可能并没有那么糟糕。从各方面来看,这个解决方案并不完美。它的主要优点是简单。我建议您不要在没有充分理由的情况下使代码过于复杂。代码的简单性和清晰性也很重要。

    查看受保护的访问修饰符查看受保护的访问修饰符查看受保护的访问修饰符查看受保护的访问修饰符查看受保护的访问修饰符查看访问修饰符
    class A : public Interface
    {
     public:
         void doAction();
    
         void interfaceMethod1();
         ...
    }
    class AExt
    {
    public:
       void doAction();
    private:
        int m_state;
    }