0

尽管我使用 C++ 编程,但这更多是关于设计的一般性问题。

我注意到当我有一对一关联关系的对象时,它们之间往往会有很多通用方法,导致样板代码基本上直接调用内部类的方法。

例如,我有一个名为的类Tab,它代表一个选项卡,它是相应的小部件。我还有一个叫做Tabbable对象可以继承的类,因此它们可以显示在选项卡中。然后ATab可以获取该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
}

很多代码是重复的,似乎没有必要。继承在这里肯定行不通,因为你不能把 a Tabin Tab

这只是我们必须处理的事情吗?或者有没有办法解决这些情况?

4

1 回答 1

1

出色地。针对这种特殊情况。为什么不简单地实施Tab::getTabbable()

像这样:

const ITabbable* Tab::getTabbable() const { return m_tabbableObject; }

然后用户可以这样做:

const ITabbable* obj = tab->getTabbable();
string title = obj->getTitle();

您不必复制所有功能。


更新:这种重构通常称为Remove Middle Man

于 2011-03-06T18:50:33.707 回答