将方法调用限制为特定 class
Restricting method call to a specific class
class A : public Interface
{
public:
void doAction();
void interfaceMethod1();
...
}
class AExt
{
public:
void doAction();
private:
int m_state;
}
我有 class A,它可以执行 doAction() 并实现接口(接口不包括 doAction)。 A 工作正常,所以我想尽量减少 A 的变化。现在我想添加新状态并创建 class AExt,它现在负责制作 doAction(),它改变状态,现在取决于状态。目标是限制 doAction() 以便它只能由 AExt 调用,因为不从 AExt 调用 A::doAction 会破坏功能。同时AExt只使用A的public接口
- 我可以将 doAction() 设为私有并使 AExt 成为 A 的朋友,但我不喜欢这样,因为它会将 A 的所有内部结构暴露给 AExt;
- 我可以使 doAction() 虚拟化并从 A 继承 AExt,同样的问题。此外,(可能)会有 A 的继任者不想知道是否有 A 或 AExt。
- 我可以为 A 和 AExt 使用相同的接口并使用 Decorator 模式,但我不喜欢这样,因为 A 有许多 AExt 不需要的附加方法(所有接口),而 A 的客户需要他们。
我可以按如下方式使用组合
但这不会阻止从外部调用 A::doAction()。
class AExt
{
public:
void doAction() { m_a.doAction(); ... }
A& getA() { return m_a; }
}
建议?
Vlad,C++ 没有提供您想要的精细粒度。您的方法 1-4 基本上是正确的。尝试将这些精细的细节添加到 C++ 中将导致一种更复杂的语言。有人说 C++ 已经太复杂了。这意味着语言设计是在可表达性和保持其合理简单性之间的权衡。
我会宣布您的 doAction();
受到保护。这将禁止从任意代码段调用它。同时 AExt
似乎是你自己的 class。如果它可以完全访问其父级,也许它并没有那么糟糕。从所有的角度来看,这个解决方案都不是完美的。它的主要优点是简单。我建议您不要在没有充分理由的情况下使您的代码过于复杂。代码的简单性和清晰度也很重要。
class A : public Interface
{
public:
void doAction();
void interfaceMethod1();
...
}
class AExt
{
public:
void doAction();
private:
int m_state;
}
我有 class A,它可以执行 doAction() 并实现接口(接口不包括 doAction)。 A 工作正常,所以我想尽量减少 A 的变化。现在我想添加新状态并创建 class AExt,它现在负责制作 doAction(),它改变状态,现在取决于状态。目标是限制 doAction() 以便它只能由 AExt 调用,因为不从 AExt 调用 A::doAction 会破坏功能。同时AExt只使用A的public接口
- 我可以将 doAction() 设为私有并使 AExt 成为 A 的朋友,但我不喜欢这样,因为它会将 A 的所有内部结构暴露给 AExt;
- 我可以使 doAction() 虚拟化并从 A 继承 AExt,同样的问题。此外,(可能)会有 A 的继任者不想知道是否有 A 或 AExt。
- 我可以为 A 和 AExt 使用相同的接口并使用 Decorator 模式,但我不喜欢这样,因为 A 有许多 AExt 不需要的附加方法(所有接口),而 A 的客户需要他们。
我可以按如下方式使用组合 但这不会阻止从外部调用 A::doAction()。
class AExt { public: void doAction() { m_a.doAction(); ... } A& getA() { return m_a; } }
建议?
Vlad,C++ 没有提供您想要的精细粒度。您的方法 1-4 基本上是正确的。尝试将这些精细的细节添加到 C++ 中将导致一种更复杂的语言。有人说 C++ 已经太复杂了。这意味着语言设计是在可表达性和保持其合理简单性之间的权衡。
我会宣布您的 doAction();
受到保护。这将禁止从任意代码段调用它。同时 AExt
似乎是你自己的 class。如果它可以完全访问其父级,也许它并没有那么糟糕。从所有的角度来看,这个解决方案都不是完美的。它的主要优点是简单。我建议您不要在没有充分理由的情况下使您的代码过于复杂。代码的简单性和清晰度也很重要。