Alternative zur downcasting methode in diesem Beispiel?
-
Folgene Klassenhierache:
class Basis{ int iBasis; }; class A : public Basis{ int iA; }; class B: public Basis{ int iB; }; class Block{ std::list<*Basis> LIST; . . . };Die Klasse Block beinhaltet eine Menge von Objekte A oder B! Die Hierachie soll nun nachträglich erweiterbar sein dur bspw. Klasse C etc.
nun gibt es zwei Klasse welche abhänigig bvom Typ ein Block konfiguriert/ erzeugt:
class ManagmentA{ Block& Add(); Config(Block *p){..}; }; class ManagmentB{ Block& Add(); Config(Block *p){..}; };ManagmentA erzeugt ein Block mit A objekten und ManagmentB mit B objekten..
nun kommt man unweigerlich nicht dran vorbei in disen Klasen auf A und B downzucaten um auf desen Eigenschaften zuzugreifen ..
gibts es ne andere Möglichkeit?
-
BorisDieKlinge schrieb:
Folgene Klassenhierache:
class Basis{ int iBasis; }; class A : public Basis{ int iA; }; class B: public Basis{ int iB; }; class Block{ std::list<*Basis> LIST; . . . };Die Klasse Block beinhaltet eine Menge von Objekte A oder B! Die Hierachie soll nun nachträglich erweiterbar sein dur bspw. Klasse C etc.
nun gibt es zwei Klasse welche abhänigig bvom Typ ein Block konfiguriert/ erzeugt:
class ManagmentA{ Block& Add(); Config(Block *p){..}; }; class ManagmentB{ Block& Add(); Config(Block *p){..}; };ManagmentA erzeugt ein Block mit A objekten und ManagmentB mit B objekten..
nun kommt man unweigerlich nicht dran vorbei in disen Klasen auf A und B downzucaten um auf desen Eigenschaften zuzugreifen ..
gibts es ne andere Möglichkeit?
Ähhh warte mal: Die Management-Klassen erzeugen die Block-Objekte (und damit auch die Listen) ?
Wo liegt dann da das Problem ?
class Management { vector<Block*> Blocks; template <typename T> // kann man auch als template schreiben Block* erzeugeBlock() { Block* b = new Block; b->LIST.insert(new T(1)); b->LIST.insert(new T(2)); Blocks.push_back(b); return b; } ... int main() { Management m; m.erzeugeBlock<A>(); m.erzeugeBlock<B>(); ...Kannst natürlich auch zwei getrennte ManagementKlassen schreiben, wenn sie zu unterschiedlich sind, aber da ginge das dann genauso. Wenn dann die Config()'s unterschiedlich arbeiten sollen, würde ich das (per klassischer Polymorphie) an A und B delegieren (entsprechende virtual Interface in der Basis).
Allerdings weiß ich nicht, wie Dein "getter" Add(); und Dein Config() dazu passen....
Gruß,
Simon2.