Designfrage zu parallelen Klassenhierarchien
-
Hallo zusammen,
ich habe ein kleines Designproblem, vielleicht kann mir jemand ein Stichwort nennen,
unter dem ich ein Pattern finden kann oder mir Hinweise geben, wie man so etwas lösen kann.Im Prinzip habe ich zwei parallele Klassenhierarchien, wobei ich versuche das
auf ein Minimalbeispiel zu reduzieren (die jeweilige Hierarchie besteht aus deutlich mehr als 2 Klassen):class A { public: void A1(); A_data data; }; class B: public A { public: B_data data; }; class A_data { }; class B_data : public A_data { };Das Problem ist nun, dass die Klasse A beispielsweise einen Algorithmus A1 bereitstellt, die das Objekt data
manipuliert. Nun möchte ich in etwa soetwas machen:B objekt; B.A1();Nur das Problem ist natürlich, dass A1() data vom Typ A_data manipulieren möchte, nicht
jedoch das "überschriebene" data vom Typ B_data, welches durch Vererbung dennoch alle
Eigenschaften bereithält, um von Algorithmus A1 bearbeitet zu werden.Ich hatte zuerst an eine Version mit templates gedacht, soetwas wie
template <class T> class A { public: void A1(); T data; }; template <class T> class B: public A<T> { public: };Aber bevor ich den kompletten Code umwälze, wollte ich mich bei euch noch einmal vergewissern.
Danke!
-
So wie dus bisher gemacht hast ist das schlechtes Design, denn du behälst das Member vom typ A_data ja noch als Ballast den du garnicht brauchst. denke immer daran, dass Vererbung eine "Ist-ein"-Beziehung ist. Das scheint mir nach deiner Beschreibung aber nicht der Fall zu sein.
Du brauchst mit dem was du beschrieben hast nichmal ein Template:[cpp]class A
{
public:
void A1();
A_data* data;void setData(A_data& rdata) {data = &rdata;}
};class A_data
{
};class B_data : public A_data
{
};int main()
{
A_data adata;
B_data bdata;A a;
a.setData(adata);
a.A1 //operiert auf adata
a.setData(bdata);
a.A1; //operiert auf bdata
} [cpp]
-
Hallo,
danke erstmal für deine Hinweise, aber ich glaube ich hab die Frage ein wenig falsch gestellt.
class TypA { }; class TypB : public TypA // Erweiterung des Typs A { } class A { public: void doA(); // do sth with data private: std::vector<TypB> data; } class B: public A { public: void doB(); // do sth with data }So in etwa ist es im Moment im Code gelöst. Eigentlich würde der Klasse A aber auch
std::vector<TypA> data;als datenmember "reichen".
Wenn ich nun die ein Objekt der Klasse A instanziiere, habe ich alle für A "überflüssigen" Erweiterungen in TypB mit dabei, obwohl diese nicht benötigt werden. (Die Klasse A benötigt TypA, die Klasse B TypB)
... ganz schön schwierig so ein Problem zu beschreiben :p Ich hoffe der Kern des Problems ist dieses mal besser beschrieben.
Danke für eure Zeit!
-
Hat noch jemand einen Tipp / Kommentar?