Desing frage (Vererbung)
-
Folgende Konstellation:
class Basis{ int X; int Y; . . . }; class A: public Basis{ . . }; class B: public Basis{ . . }; class C: public Basis{ . . }; class D: public Basis{ . . };so nun will ich in allen subklasen A-D die Variable X aus Basis verwenden.. soweit kein problem. nun will ich aber die Variable Y nur in A-C verwenden drüfen, und nich in D! geht das ???
-
finde ich nicht logisch, warum dann nicht so?
class Basis{ int X; . . . }; class A: public Basis{ .int Y; . }; class B: public Basis{ .int Y; . }; class C: public Basis{ .int Y; . }; class D: public Basis{ . . };
-
class BasisX{ int Y; . . . }; class BasisY : public BasisX{ int Y; . . . }; class A: public BasisY{ . . }; class B: public BasisY{ . . }; class C: public BasisY{ . . }; class D: public BasisX{ . . };
-
soll natuerich X sein in BasisX.
@elise: Das ist genau das was man mit OOP verhindern will, eben den gleichen Code per copy-Paste an vielen Stellen haben (in dem Fall int Y)
-
@skals: Die Möglichkeit hab ich auch schon in betracht gezoge.. aber ich dachte es gibt ne bessere Lösung, damit ich die zweite Basis klasse weglassen kann.
Ist auch nich soo tragisch... wenn es nich geht... werde halt dann in der Klasse D den wert Y nich nutzen und fertig...
-
Hi,
das klingt für mich nach einem Denk-/Designfehler. Es ist "guter Stil", Vererbung für "ist-ein-Relationen" einzusetzen.
Wenn also A-D von Basis erben, muss gelten "A IST ein Basis", "B IST ein Basis", ...
und das bedeutet, dass sie auch die Eigenschaften (Attribute und Methoden) von Basis besitzen. Wenn sie diese Eigenschaften NICHT haben, sollten sie nicht davon erben.
Man käme ja auch nicht auf die Idee, grünerBMW von rotesAuto abzuleiten...... und das nicht, weil ein paar snobistische Puristen ihr ästhetisches Empfinden verletzt sehen, sondern weil einfach schon so viele normale Leute da üble Probleme bekommen und blutige Nasen geholt haben.
Gruß,
Simon2.
-
BorisDieKlinge schrieb:
@skals: Die Möglichkeit hab ich auch schon in betracht gezoge.. aber ich dachte es gibt ne bessere Lösung, damit ich die zweite Basis klasse weglassen kann.
Ist auch nich soo tragisch... wenn es nich geht... werde halt dann in der Klasse D den wert Y nich nutzen und fertig...Hmm, ich denke Du machst damit einen Fehler. Die Lösung mit zwei Klassen ist genau das, was Du beschreibst, die zweite Klasse wegzulassen weil es dir lästig erscheint heisst imho, sich für das falsche Design zu entscheiden.
Oberklassen sollen Gemeinsamkeiten zusammenfassen, Unterkassen trennen die Unterschiede voneinander. Wenn also in einer Oberklasse Elemente sind, die davon ableitende Unterklassen nicht brauchen (im Beispiel Y), dann ist das unsauberes Design. Unsauber, weil das Design sagt: Y ist ein Basiselement von D während Du selber eigendlich implementieren willst: Y ist _kein_Basiselement von D. Das ist ein Widerspruch zwischen Design und Implementierung.
Extrem ausgedrückt könntest Du ja sonst auch alles in eine große Klasse packen und A-D ganz weglassen.