2010-12-08 34 views
0

這有點棘手,但我會盡我所能解釋它。促進這種情況下的代碼重用

我正在製作遊戲的Gui API,它有主題。

首先我將解釋小工具是如何工作的。

一個按鈕,例如,從Widget繼承。 主題工作類似。

ButtonTheme繼承自WidgetTheme。

每個窗口小部件類中都有一個它的corrosponding Theme實例。

Widget類有:

private: 
    static WidgetTheme widgetTheme; 
    public: 
    static WidgetTheme& getWidgetTheme(); 

按鈕類有:

private: 
    static ButtonTheme buttonTheme; 
    public: 
    static ButtonTheme& getButtonTheme(); 

Widget的構造,從主題前建立本身:

Widget() 
{ 
    setFont(getWidgetTheme().getFont()); 
} 

按鈕,從WidgetTheme繼承,必須做同樣的事情,因爲內部的小部件不知道從ButtonTheme構造,所以我的按鈕結束不得不這樣做:

Button() 
{ 
    setFont(getButtonTheme().getFont()); 
    setButtonPadding(getButtonTheme().getButtonPadding()); 
} 

這是我的問題所在。我真的覺得不對,我必須重新提供所有的WidgetTheme,並將它們重定向到ButtonTheme的Widget參數。如果我不這樣做,SuperButton會繼承Button的樣式,它也會繼承Widget的樣式,但是我想要的是SuperButton使用它的ButtonTheme和WidgetTheme版本,因爲SuperButtonTheme會繼承ButtonTheme和WidgetTheme。

有沒有一種方法可以重新設計這個,這樣構造函數只需要設置它帶來的主題的一部分,而不必設置它的父母的部分?

感謝

回答

2

虛擬getTheme()(如drewish建議),但使用covariant return types應該不需要強制類型轉換來解決你的問題。

+0

假設所有主題功能都是虛擬的。 – Dialecticus 2010-12-08 22:31:46

0

我在哪裏getButtonTheme()和getWidgetTheme()住在你的對象層次不是很清楚,但現在看來似乎應該是最多的類以瞭解它的主題是什麼,所以爲什麼不能有一個getTheme()方法在你的類上?也許我太習慣於腳本語言,並且沒有認識到嚴格打字的一些問題。

+0

是的,但getTheme不會工作,因爲我只能返回1種類型,並且如果用戶必須鍵入它,那麼醜陋 – jmasterx 2010-12-08 22:15:13

1

Widget構造函數可以接受WidgetTheme並使用它。

Widget(const WidgetTheme& theme) 
{ 
    setFont(theme.getFont()); 
} 

Button() : Widget(getButtonTheme()) 
{ 
    setButtonPadding(getButtonTheme().getButtonPadding()); 
}