Einsendung:

Lösungsvorschlag

Meiner Meinung nach sieht die Situation wie folgt aus:
Eine Ellipse ist ein Objekt mit zwei Mittelpunkten. Liegen diese übereinander, so wird aus der Ellipse ein Kreis. Also: Ein Kreis ist eigentlich eine Vereinfachung der Ellipse. Ich stelle einen möglichst weitreichende Basisklasse zur Verfügung (Ellipse), die Kreis-Klasse vereinfacht diese dann nur.
Man könnte jedoch auch einfach in die Ellipsen-Klasse eine Eigenschaft namens

   void beCircle(bool)

einfügen, die einfach center2=center1 setzt und eine Änderung des Attributes center2 ab dann ignoriert. Das wäre bestimmt weniger Programmieraufwand.

Treffer. Soweit jedenfalls. Also, eigentlich 100 Punkte, aber...
Antwort A:
Die Ellipse hat zusätzlich zum Kreis noch einen kleinen und einen großen Halbmesser. Beide kann man ausrechnen, wenn die Brennpunkte (center1 und center2) bekannt sind. .
Die Methoden seien:

   void zeichneAufDenBildschirm(void)

und

   void berechneFlaeche(void)//PI*kH*gH

Beide Funktionen funktionieren unverändert für den Kreis.
In diesem Modell (zwei Mittelpunkte, zwei Halbmesser, zeichnen, Fläche) gilt ganz klar: Alle Eigenschaften, die die Ellipse hat, die hat auch der Kreis. Deswegen kann der Kreis von der Ellipse erben. Und der Kreis hat sogar noch ein paar Eigenschaften dazu: nämlich die Mittelpunkte sind gleich und die Halbmesser sind gleich.
Antwort B:
Jetzt soll aber noch zur Ellipse die Funktion

   void ichDrueckDich(void)

hinzukommen. Diese Funktion macht den kurzen Halbmesser halb so lang, wie er war. Das ist für Ellipsen eine gültige Operation. Die Fläche wird sich halbieren, aber sonst bleibt es eine hübsche Ellipse. Ich kann die Funktion aber nicht auf einem Kreis ausführen. Wenn ich den drücke, dann geht er kaputt! Ein Kreis kann das einfach nicht, ohne seine Eigenschaft, ein Kreis zu sein, zu verlieren. Der Kreis kann also nicht von einer drückbaren Ellipse erben. Ob der Kreis von der Ellipse erben kann, hängt also davon ab, welche Methoden die Klasse Ellipse hat.
Antwort C:
Der Kreis hat einen Mittelpunkt und eine Fläche. Die Ellipse hat noch einen zweiten Mittelpunkt dazu. Damit könnte die Ellipse von Kreis erben.
Antwort D:
Der Kreis hat einen Radius. Das ist der Abstand aller Kreispunkte zum Mittelpunkt. Diese Eigenschaft kennt die Ellipse nicht. Also kann die Ellipse nicht von Kreis erben.
Fazit:

 Es hängt vom Modell ab!

Bei Vererbung muß gelten: Wenn A von B erbt, dann hat A alle Eigenschaften, die B auch hat. Dabei müssen aber nur die Eigenschaften berücksichtigt werden, die wir in unserem Modell überhaupt verwenden.
Man muß aber nicht immer Vererbung einsetzen, nur weil man das gerade darf. Normalerweise würde ich zum Kreis-Ellipse-Problem sagen, daß Lösung A angemessen ist.
Aber (Sie wissen schon):

Es hängt vom Modell ab!

Es hängt vom Modell ab!

Es hängt vom Modell ab!

Ein guter Wegweiser auf der Suche, was von wem erben soll, sind Begriffsstrukturen. Singvogel ist ein Unterbegriff von Vogel. Dann sollte (normalerweise) auch Singvogel von Vogel erben.
Und jetzt lesen Sie unter diesen Aspekten am besten noch einmal die Lektion Klassen durch!



Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 08/25/00