Favour Composition over Inheritance - Aber Wann?
-
Firefighter schrieb:
Aktuell sollen wir ein Projekt fuer die Uni machen wo wir ne einfache Personenhierachie einer Universitaet darstellen sollen (Personen, Studenten, Beschaeftigte, Professoren). Eigentlich ist das ein Paradebeispiel fuer Vererbung, jedoch wollte ich mich mal von der Vererbung loesen und Versuchen es mit Komposition zu loesen.
Ich seh eine Klasse Person und drei Rollen (Studenten, Beschaeftigte, Professoren).
-
Zeus schrieb:
Firefighter schrieb:
Aktuell sollen wir ein Projekt fuer die Uni machen wo wir ne einfache Personenhierachie einer Universitaet darstellen sollen (Personen, Studenten, Beschaeftigte, Professoren). Eigentlich ist das ein Paradebeispiel fuer Vererbung, jedoch wollte ich mich mal von der Vererbung loesen und Versuchen es mit Komposition zu loesen.
Ich seh eine Klasse Person und drei Rollen (Studenten, Beschaeftigte, Professoren).
Hätte ich erst mal auch so gesagt. Bis jetzt wurde ja noch nicht mal angegeben, ob irgendeiner von denen was besonderes kann bzw. für was die überhaupt da sind.
-
Wuerde es mehr Informationen geben, haette ich die euch sicherlich gegeben oder?
TyRoXx schrieb:
Firefighter schrieb:
Ja das wird es wohl sein, das heisst wir koennen abschliessend sagen, das meine Frage im C++ Bereich nicht so einfach zu beantworten waere wie im Java/C# Bereich.
Damit ist auch alles geklaert fuer mich
So ein Unsinn, Objektorientiertung funktioniert in C++ genauso wie in C# oder Java.
Ich wollte auch gar nicht ausdruecken das es mit C++ so nicht geht, aber wir haben ja in der Diskussion davor festgestellt das es Sprachabhaengig ist und schon Unterschiede macht ob ich nun in C++ oder C#/Java unterwegs bin.
-
Ich hab mir die Aufgabe nochmal eben durchgelesen und sehe gerade das sich die Klassen eigentlich nicht durch Funktionalitaet unterscheiden sondern nur durch Attribute. Da bin ich ja der Meinung das mir Vererbung nicht wirklich was nutzt.
Wenn ich keine Unterschieden im Verhalten habe sondern nur in Eigenschaften koennte man das ganze ja dann doch als Komposition aufziehen oder nicht? Ich meine Polymorphie bringt mir ja dann nicht mehr wirklich was wenn ich nen Zeiger auf ne Person irgendwo hin uebergebe und ich keine spezialisierten Funktionen habe, hab ich ja eh nur Information ueber die Personenattribute.Die Aufgaben unseres Dozenten sind nicht wirklich sinnvoll
-
Firefighter schrieb:
Ich hab mir die Aufgabe nochmal eben durchgelesen und sehe gerade das sich die Klassen eigentlich nicht durch Funktionalitaet unterscheiden sondern nur durch Attribute. Da bin ich ja der Meinung das mir Vererbung nicht wirklich was nutzt.
Ne, gerade dafür ist Polymorphie Da: Nach außen gleiches Verhalten, aber intern anderes Verhalten (oder andere Attribute).
Dinge die von Person erben verhalten verhalten sich ja gerade auch wie Personen und nicht anders. Sonst wären sie gerade keine Personen.
-
Firefighter schrieb:
Ich hab mir die Aufgabe nochmal eben durchgelesen und sehe gerade das sich die Klassen eigentlich nicht durch Funktionalitaet unterscheiden sondern nur durch Attribute. Da bin ich ja der Meinung das mir Vererbung nicht wirklich was nutzt.
So ist es.
Und ohne Vererbung kannste endlich die "Typen" ändern. Wenn ein Student plötzlich zum Mitarbeiter wird, ist das mit Vererbung gar nicht darstellbar, weil Objekte in C++ ihren Typ nicht ändern können. Und Qs Hiwi ist zwanglos darstellbar ohne irgendwelche Diamanten(Übersetzungsfehler, muß natürlich Rauten heißen).
Natürlich zu den Kosten des Risikos, daß sich das Verhalten vielleicht im Laufe des Programms doch ändert und Du Dir dann virtuelle Methoden wünschen würdest.
Firefighter schrieb:
Die Aufgaben unseres Dozenten sind nicht wirklich sinnvoll
Ich denke, wir sind uns einig, daß er Vererbung sehen will.
-
Tachyon schrieb:
Firefighter schrieb:
Ich hab mir die Aufgabe nochmal eben durchgelesen und sehe gerade das sich die Klassen eigentlich nicht durch Funktionalitaet unterscheiden sondern nur durch Attribute. Da bin ich ja der Meinung das mir Vererbung nicht wirklich was nutzt.
Ne, gerade dafür ist Polymorphie Da: Nach außen gleiches Verhalten, aber intern anderes Verhalten (oder andere Attribute).
Dinge die von Person erben verhalten verhalten sich ja gerade auch wie Personen und nicht anders. Sonst wären sie gerade keine Personen.Jaja das ist ja klar. Aber will ich meistens nicht unterschiedliches Verhalten im Sinne von unterschiedliche Implementierte Funktionen oder aehnliches die ich dann ueber einen Basiszeiger aufrufen kann und somit das Verhalten des jeweiligen Objektes(Student, Professor usw) zu erhalten. Nur gibt es bei dieser Aufgabe keinerlei solche "Verhalten" die von Klasse zu Klasse unterschiedlich sind.
-
volkard schrieb:
Ich denke, wir sind uns einig, daß er Vererbung sehen will.
Da hast du mit Sicherheit Recht. Nur ist die Frage ob ich ihm das aus praesentiere
-
Firefighter schrieb:
Jaja das ist ja klar. Aber will ich meistens nicht unterschiedliches Verhalten im Sinne von unterschiedliche Implementierte Funktionen oder aehnliches die ich dann ueber einen Basiszeiger aufrufen kann und somit das Verhalten des jeweiligen Objektes(Student, Professor usw) zu erhalten. Nur gibt es bei dieser Aufgabe keinerlei solche "Verhalten" die von Klasse zu Klasse unterschiedlich sind.
Besser immer Quoten, auf wen Du antwortest. Ich nehme an, Du hast hier den Tachyon angesprochen und gefragt.
-
Oeehh, ja klar, werd ich gleich beheben.
-
Firefighter schrieb:
Jaja das ist ja klar. Aber will ich meistens nicht unterschiedliches Verhalten im Sinne von unterschiedliche Implementierte Funktionen oder aehnliches die ich dann ueber einen Basiszeiger aufrufen kann und somit das Verhalten des jeweiligen Objektes(Student, Professor usw) zu erhalten. Nur gibt es bei dieser Aufgabe keinerlei solche "Verhalten" die von Klasse zu Klasse unterschiedlich sind.
Vererbung muss ja nicht gleich Polymorphie beinhalten. Wenn die 3 spezialisierten Typen von Person erben, kannst Du alle 3 spezialisierten Typen an all den Stellen benutzen, an denen nur eine Person erwartet wird. Das geht auch ohne Laufzeitplymorphie. Wenn die 3 spezialleren Typen nun aber Person aggregieren, dann würde das nicht mehr gehen.
Außerdem hat es rein vom Modell her einen schalen Beigeschmack, wenn ein Student eine Person hat, aber keine Person ist. Gespaltene Persönlichkeit?
-
Kannst du die Aufgabenstellung mal posten?
Denn gerade bei Personen und ihren Rollen kann es etwas tricky werden was die korrekte Lösung ist.
-
Klaro gerne:
http://www.harald-brandenburg.de/prog2/ueb/9/Aufgabe9.pdfDas einzige was sich in meinen Augen unterscheidet ist die Sortierung die er am Ende will, ja und das hat ja nun recht wenig mit den Personen zu tuen, sondern das werd ich als Strategie anbieten.
-
Die "zusätzlich (mindestens)"-Formulierung ist ziemlich doof.
Einfach runtergelesen hätte der Student die Infos von Person, der Mitarbeiter die Infos von Student und der Prof die Infos von Mitarbeiter -> klingt wenig sinnvoll.
Ich denke mal eher, dass alle Personen sind, und der Prof außerdem einen Mitarbeiter darstellt.
Die Sortierungen wären dann einmal mit einem Personen-Sortierer machbar und einmal mit einem speziellen Studenten-Sortierer. Die Ausgabe sollte polymorph sein, da die Spezialisierungen zusätzliche Attribute haben, und Du dann wunderbar Personen-Objektreferenzen zur Ausgabe benutzen kannst.
-
Ok das waere dann eine Funktion die ich virtuell in der Person mache - die Funktion zur Ausgabe der jeweiligen Person.
Das wird der Brenner werden
-
Firefighter schrieb:
Ok das waere dann eine Funktion die ich virtuell in der Person mache - die Funktion zur Ausgabe der jeweiligen Person.
Das wird der Brenner werdenDas wird toll. Die void Professor::printAt(ostream&) ruft bevor Professor-Daten ausgegeben werden, die Mitarbeiter::printAt auf. Und diese wiederum ruft vor den eigenen Ausgaben die pur virtuelle aber trotzdem implementierte(!) Person::printAt auf.
Außerdem muß jeder sagen können, was er ist.##################################### # Professor ##################################### Vorname: Hans Nachname Meiser ...
Woher dem String "Professor" nehmen? Eine virtuelle char const* getClassName(), die in Person::printAt aufgerufen wird?
-
Ja ja das ist schon klar das ich das so machen muss.
Ich finds nur - naja. Aber werde es wohl so machen.
-
Tachyon schrieb:
Wenn die 3 spezialleren Typen nun aber Person aggregieren, dann würde das nicht mehr gehen.
Außerdem hat es rein vom Modell her einen schalen Beigeschmack, wenn ein Student eine Person hat, aber keine Person ist. Gespaltene Persönlichkeit?Machs doch andersrum: Eine Person hat ein Attribut, das die zusätzlichen Informationen beinhaltet. Dieses Attribut kann sich selbst ausgeben. Dann brauchst du auch keine virtuellen Funktionen mehr.
-
Bei dieser Aufgabe kommt es vor allem auf die Gestaltung angemessen vieler, guter Klassen bzw. Klassenhierarchie(
n) an.Damit ist wohl Vererbung "vorgegeben".
-
http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)#Limitations_and_alternatives
Lustigerweise hat wikipedia sogar mal was passendes zu sagen