避免一对一关联关系中的样板代码 虽然我在C++中编程,但这是一个关于设计的一般问题。
我注意到,当我有一对一关联关系中的对象时,它们之间往往有很多公共方法,这导致了基本上直接调用内部类方法的样板代码 例如,我有一个名为避免一对一关联关系中的样板代码 虽然我在C++中编程,但这是一个关于设计的一般问题。,c++,refactoring,coding-style,boilerplate,C++,Refactoring,Coding Style,Boilerplate,我注意到,当我有一对一关联关系中的对象时,它们之间往往有很多公共方法,这导致了基本上直接调用内部类方法的样板代码 例如,我有一个名为Tab的类,它表示一个选项卡及其对应的小部件。我还有一个名为Tabbable的类,对象可以继承该类,因此它们可以显示在选项卡中。然后,选项卡可以获取这个选项卡对象并正确地呈现它自己。例如,这两个类都有许多与标题或图标相关的类似方法 class ITabbable { public: ITabbable(); virtual ~ITabbabl
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
}
很多代码都是重复的,似乎没有必要。继承在这里肯定不起作用,因为您不能在选项卡中放置选项卡
这只是我们必须处理的事情吗?还是有办法解决这些情况?嗯。这是一种特殊情况。为什么不简单地实现选项卡::gettabble()
像这样:
const ITabbable* Tab::getTabbable() const { return m_tabbableObject; }
然后用户可以执行以下操作:
const ITabbable* obj = tab->getTabbable();
string title = obj->getTitle();
您不必复制所有功能
更新:这种重构通常被称为