将方法调用限制为特定类
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;
}
我有可以做 Action(( 的类 A 并且还实现接口(接口不包括 doAction(。A 工作正常,所以我想尽量减少 A 中的更改。现在我想添加新状态并创建类 AExt,它现在负责制作 doAction((,这会更改状态,现在取决于状态。目标是限制 doAction((,以便它只能由 AExt 调用,因为不是从 AExt 调用 A::d oAction 会破坏功能。同时AExt仅使用A的公共接口。
- 我可以将 doAction(( 设为私有并使 AExt 成为 A 的朋友,但我不喜欢这样,因为它会将 A 的所有内部暴露给 AExt;
- 我可以使doAction((成为虚拟并从A继承AExt,同样的问题。此外,(很可能(会有 A 的继任者不想知道是否存在 A 或 AExt。
- 我可以对 A 和 AExt 使用相同的接口并使用装饰器模式,但我不喜欢这样,因为 A 有许多 AExt 不需要的附加方法(所有接口(,而 A 的客户需要它们。
我可以按如下方式使用构图但这不会阻止从外部调用 A::d oAction((。
class AExt { public: void doAction() { m_a.doAction(); ... } A& getA() { return m_a; } }
建议?
Vlad,C++没有提供您想要的精细粒度。你的方法1-4基本上是正确的。尝试将这些精细的细节添加到C++将导致更复杂的语言。有人说C++已经太复杂了。这意味着语言设计是在可表达性和保持合理简单的愿望之间的权衡。
我会宣布你的doAction();
受到保护。这将禁止从任意代码段调用它。同时,似乎AExt
是你自己的班级。如果它可以完全访问其父级,也许它并没有那么糟糕。从所有角度来看,此解决方案并不完美。它的主要优点是简单。我建议您不要在没有充分理由的情况下使您的代码过于复杂。代码的简单性和清晰度也很重要。
相关文章:
- 如何强制从重写方法调用重写的方法基方法?
- C++:使用方法调用析构函数的顺序是什么?
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 指向类方法调用的指针
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 是否有可以处理方法调用依赖关系的设计模式?
- 如何缩短C++中的方法调用?
- 从部分专用模板方法调用模板非静态方法
- 有没有办法禁止派生类中的基类方法调用?
- 为什么这C++只在编译器上编码一个不明确的方法调用Microsoft?
- 从父方法调用子方法
- 如何将子方法调用到父方法
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 从静态方法调用静态函数指针
- 从同一类中的另一个方法调用方法时出错
- 方法调用意外地像 l 值一样起作用
- 无法从派生的一个方法调用基类方法
- 从类方法调用命名空间中名为 Same 的函数时,重载解析失败
- C 多线程JAVA JNI方法调用