限制方法调用特定类

时间:2015-03-04 07:57:24

标签: c++ encapsulation

class A : public Interface
{
 public:
     void doAction();

     void interfaceMethod1();
     ...
}
class AExt
{
public:
   void doAction();
private:
    int m_state;
}

我有A类,它可以执行doAction()并实现接口(接口不包括doAction)。 A工作正常,所以我想最小化A中的变化。现在我想添加新状态并创建类AExt,现在负责制作doAction(),它改变状态,现在取决于状态。目标是限制doAction(),以便它只能被AExt调用,因为不是从AExt调用A :: doAction会破坏功能。同时,AExt仅使用A的公共接口。

  1. 我可以将doAction()私有化并成为A的AExt朋友,但我不喜欢这样,因为它会将所有A的内部暴露给AExt;
  2. 我可以使doAction()虚拟并从A继承AExt,同样的问题。此外,还有(可能)是A的继任者,他们不想知道是否有A或AExt。
  3. 我可以为A和AExt使用相同的界面并使用Decorator模式,但我不喜欢这样,因为A有许多其他方法(所有界面),AExt并不需要,以及客户端需要他们。
  4. 我可以使用如下组成 但这不会阻止从外部调用A :: doAction()。

    class AExt { public: void doAction() { m_a.doAction(); ... } A& getA() { return m_a; } }

  5. 建议?

1 个答案:

答案 0 :(得分:3)

Vlad,C ++没有提供您想要的精细粒度。你的方法1-4基本上是正确的。尝试将这些精细的细节添加到C ++中将导致更复杂的语言。有人说C ++已经太复杂了。这意味着语言设计是表达能力与保持合理简单的愿望之间的交易。

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