2010-12-08 29 views
0

C'est un peu difficile à expliquer mais je ferai de mon mieux pour l'expliquer. Je fais une API Gui pour les jeux et elle a des thèmes.Promouvoir la réutilisation de code pour cette situation

D'abord je vais vous expliquer comment fonctionnent les Widgets.

Un bouton par exemple, hérite de Widget. Les thèmes fonctionnent de manière similaire.

ButtonTheme hérite de WidgetTheme.

l'intérieur de chaque classe de widget, il est une instance de son thème correpondant.

classe Widget a:

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

a:

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

le constructeur Widget, se construit à partir de son thème ex:

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

le bouton, héritant de WidgetTheme , doit faire les mêmes parce que le widget interne ne sait pas construire à partir de ButtonTheme, donc mon bouton finit par avoir à faire:

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

C'est où mon problème est. Il me semble vraiment erroné que je doive réécrire tous les WidgetTheme et les rediriger vers les paramètres de ButtonTheme pour Widget. Si je ne fais pas cela, un SuperButton hériterait des styles de Button qui hériteraient aussi des styles de Widget, mais ce que je veux c'est que SuperButton utilise sa version de ButtonTheme et WidgetTheme car SuperButtonTheme hériterait de ButtonTheme et de WidgetTheme.

Est-il possible que je pourrais revoir cela pour que le constructeur ne dispose que de définir les parties du thème qu'il apporte, et ne pas avoir à mettre ceux de ses parents?

Merci

Répondre

2

Un getTheme() virtuel (comme le suggère drewish) mais en utilisant covariant return types devrait résoudre votre problème sans exiger des moulages.

+0

A condition que toutes les fonctions du thème soient virtuelles. – Dialecticus

+0

Cela pourrait-il fonctionner avec des références, ex, renvoyant un ButtonTheme &? – jmasterx

0

Je ne suis pas tout à fait clair sur l'endroit où getButtonTheme() et getWidgetTheme() vivent dans la hiérarchie d'objets, mais il semble que ce devrait être à la classe de savoir ce que le thème est alors pourquoi ne pas avoir une méthode getTheme() sur votre classe? Peut-être que je suis trop habitué aux langages de script et que je n'apprécie pas certains problèmes de typage strict.

+0

Oui, mais getTheme ne fonctionnera pas car je ne peux retourner qu'un seul type, et si l'utilisateur doit taper cast c'est moche – jmasterx

1

Le constructeur Widget peut accepter un WidgetTheme et l'utiliser.

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

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