class A : public Interface
{
public:
void doAction();
void interfaceMethod1();
...
}
class AExt
{
public:
void doAction();
private:
int m_state;
}
我有一个可以做doAction()并实现接口(接口不包含doAction)的类A。 A可以正常工作,所以我想最小化A中的更改。现在,我想添加新状态并创建AExt类,该类现在负责执行doAction(),该操作将更改状态并现在依赖于状态。目的是限制doAction()使其只能由AExt调用,因为不是从AExt调用A :: doAction会破坏功能。同时,AExt仅使用A的公共接口。
我可以将doAction()设为私有并与AExt成为AExt的朋友,但是我不喜欢这样,因为它会将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; }}
建议?
最佳答案
弗拉德,C ++无法提供所需的精细粒度。您的方法1-4基本上是正确的。试图在C ++中添加如此精细的细节将导致语言更加复杂。有人说C ++已经太复杂了。这意味着语言设计是可表达性和使其保持合理简单性之间的权衡。
我会宣布您的doAction();
受保护。这将禁止从任意代码中调用它。同时,AExt
似乎是您自己的课。如果它可以完全访问其父级,则可能不是那么糟糕。从所有角度来看,此解决方案都不是完美的。它的主要优点是简单。我建议您在没有充分理由的情况下不要使代码过于复杂。代码的简洁性和重要性也很重要。
关于c++ - 将方法调用限制为特定的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28849194/