将方法调用限制为特定类

Restricting method call to a specific class

本文关键字:方法 调用      更新时间:2023-10-16
class A : public Interface
{
 public:
     void doAction();
     void interfaceMethod1();
     ...
}
class AExt
{
public:
   void doAction();
private:
    int m_state;
}

我有可以做 Action(( 的类 A 并且还实现接口(接口不包括 doAction(。A 工作正常,所以我想尽量减少 A 中的更改。现在我想添加新状态并创建类 AExt,它现在负责制作 doAction((,这会更改状态,现在取决于状态。目标是限制 doAction((,以便它只能由 AExt 调用,因为不是从 AExt 调用 A::d oAction 会破坏功能。同时AExt仅使用A的公共接口。

  1. 我可以将 doAction(( 设为私有并使 AExt 成为 A 的朋友,但我不喜欢这样,因为它会将 A 的所有内部暴露给 AExt;
  2. 我可以使doAction((成为虚拟并从A继承AExt,同样的问题。此外,(很可能(会有 A 的继任者不想知道是否存在 A 或 AExt。
  3. 我可以对 A 和 AExt 使用相同的接口并使用装饰器模式,但我不喜欢这样,因为 A 有许多 AExt 不需要的附加方法(所有接口(,而 A 的客户需要它们。
  4. 我可以按如下方式使用构图但这不会阻止从外部调用 A::d oAction((。

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

建议?

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

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