虽然我在用 C++ 编程,但这更像是一个关于设计的一般问题。
我注意到当我有一对一关联关系的对象时,它们之间往往有很多通用方法,导致样板代码本质上直接调用内部类的方法。
例如,我有一个名为 Tab
的类,它表示一个选项卡及其对应的小部件。我还有一个对象可以继承的名为 Tabbable
的类,因此它们可以显示在选项卡中。 Tab
然后可以使用此 Tabbable
对象并正确呈现自身。例如,这两个类都有很多与标题或图标相关的相似方法。
class ITabbable {
public:
ITabbable();
virtual ~ITabbable();
virtual string getTitle() = 0;
virtual widget getContentWidget() = 0;
// etc...
}
class Tab {
public:
Tab(ITabbable* tabbableObject);
// lots of boilerplate code:
string getTitle() {
return m_tabbableObject->getTitle();
}
widget getContentWidget() {
return m_tabbableObject->getContentWidget();
}
// etc...
private:
ITabbable* m_tabbableObject; // association relationship
}
很多代码都是重复的,看起来没有必要。继承在这里绝对不起作用,因为您不能将 Tab
放在 Tab
中。
这只是我们必须处理的事情吗?或者有解决这些情况的方法吗?
最佳答案
嗯。针对这种特殊情况。为什么不简单地实现 Tab::getTabbable()
?
像这样:
const ITabbable* Tab::getTabbable() const { return m_tabbableObject; }
然后用户可以:
const ITabbable* obj = tab->getTabbable();
string title = obj->getTitle();
您不必复制所有功能。
更新:此重构通常称为 Remove Middle Man .
关于c++ - 避免一对一关联关系中的样板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5212609/