【发布时间】:2009-12-03 21:57:19
【问题描述】:
我有两个密切相关的类,我将它们称为 Widget 和 Sprocket。 Sprocket 有一组方法,我希望它们可以从 Widget 调用,但不能从任何其他类调用。我也不想仅仅将 Widget 声明为 Spocket 的朋友,因为这将使 Widget 可以访问所有受保护和私有成员。我想限制 Widget 只能访问一组特定的方法。
我想出的一个解决方案是在 Sprocket 中创建一个嵌套类,其中包含这些方法的包装器,并使 Widget 成为这个嵌套类的朋友。例如:
class Sprocket
{
public:
class WidgetInterface
{
friend class Widget;
WidgetInterface(Sprocket* parent) : mParent(parent) {}
private:
void A() { mParent->A(); }
void B() { mParent->B(); }
Sprocket* mParent;
};
private:
void A() { ... }
void B() { ... }
};
class Widget
{
public:
Widget(Sprocket* sprock) : mSprocketIface(sprock) {}
void doStuff() { mSprocketIface.A(); } // Widget can call Sprocket::A()
private:
Sprocket::WidgetInterface mSprocketIface;
};
这会导致一些代码重复,因为方法签名现在在两个地方声明,但它可以工作。但现在假设我想添加一个名为 SpecialWidget 的 Widget 子类,并且我希望该类也可以访问 Sprocket 方法。我可以简单地将这个新类添加到 Sprocket 朋友列表中,或者我可以在 Widget 中添加另一组受保护的包装器,SpecialWidget(和任何其他子类)可以访问,但是您可以看到这现在已成为维护问题。如果我添加新类或更改方法签名,我不想更新朋友列表或包装器。如果我使用“添加另一组包装器”的方法,方法签名将在三个地方重复!
有没有人知道更简单、更清洁的方法?
【问题讨论】:
-
@Eric 谢谢,关键技巧在这里可能有用。
标签: c++ inheritance