2011-03-06 44 views
0

尽管我使用C++进行编程,但这更多的是关于设计的一般问题。以一对一的关联关系避免样板代码

我注意到,当我有一对一的关联关系中的对象时,它们之间往往存在很多通用方法,从而导致基本上直接调用内部类的方法的样板代码。例如,我有一个名为Tab的类,它表示一个选项卡,它是相应的小部件。我还有一个名为Tabbable的类,对象可以继承,因此可以在选项卡中显示它们。 A 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。我们不得不处理这个问题吗?或者有办法解决这些情况?

回答

1

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

像这样:

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

然后用户就可以做到:

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

您不必复制所有功能。


更新:此重构通常被称为Remove Middle Man

+0

非常简单和优雅,谢谢! – 2011-03-10 15:42:04