虽然我是用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
。
这只是我们必须处理的事情吗?或者有办法绕过这些情况吗?
答案 0 :(得分:1)
好。对于这种特殊情况。为什么不简单地实施Tab::getTabbable()
?
像这样:
const ITabbable* Tab::getTabbable() const { return m_tabbableObject; }
然后用户可以这样做:
const ITabbable* obj = tab->getTabbable();
string title = obj->getTitle();
您无需复制所有功能。
更新:此重构通常称为Remove Middle Man。