Designproblem (Methoden auslagern)
-
Hallo NG,
Ich schlage mich zur Zeit mit einem Designproblem herum und hoffe, dass es noch eine bessere Lösung als die meine gibt.
Folgendes Szenario:
Es gibt 4 Grundklassen, die in einer Hierarchie aufgebaut sind.
C erbt von A und B. D erbt von C. Von diesen 4 Grundklassen sind wiederum viele Klassen abgeleitet, die jetzt hier keine Rolle spielen.
Von jeder dieser 4 Klassen möchte ich statistische Werte erzeugen. Diese sollen jedoch jeweils in einer eigenen Klasse implementiert werden. D.h die Berechnung der Statistik soll nicht in den Grundklassen erfolgen. Diese rufen nur spezielle Methoden in der jeweiligen Statistikklasse auf (nach dem Motto Ereignis X ist eingetreten)
Die statistischen Werte wiederum verfolgen die gleiche Hierarchie wie die Grundklassen. D.h. Die Statistik für C enthält alle Statistikwerte von A und B und definiert neue.Meine bisherige Lösung
class statistic_monitor { public: virtual ~statistic_monitor(); protected: statistic_monitor(); }; class statistic_provider { public: inline const statistic_monitor& get_statistic(); virtual ~statistic_provider(); protected: statistic_provider(); virtual statistic_monitor* create_monitor() = 0; private: statistic_monitor* m_monitor; }; inline const statistic_monitor& statistic_provider::get_statistic() { return *m_monitor; }Implementation:
statistic_provider::~statistic_provider() { if (m_monitor != NULL) delete m_monitor; } statistic_provider::statistic_provider() { m_monitor = create_monitor(); }Jede der 4 Grundklassen erbt nun von statstic_provider. Zusätzlich gibt es 4 Statstikklassen, die der gleichen Hierarchie folgen wie die Grundklassen und von statistic_monitor erben. In den 4 Grundklassen wird jeweils die Methode create_monitor überschrieben und eine neue Instanz der jeweiligen Statistikklasse zurückgegeben.
Was mir noch nicht gefällt:
Die Statistikobjekte sind in den Grundklassen nur als Angehörige der Klasse statistic_monitor bekannt und müssen explizit in ihren richtigen Typ gecastet werden.Ich vermute, dass es noch eine bessere Lösung mittels Templates gibt, finde sie aber nicht selbst.
Grüße
Timo
-

Kapiert das einer? Ein Diagramm täte gut tun. So nach dem Motto UML.