2011-03-06 53 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