避免一对一关联关系中的样板代码 虽然我在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();
您不必复制所有功能


更新:这种重构通常被称为