OOP-Konzepthilfe gebraucht.

glitsch

Aktives Mitglied
Hi zusammen,
ich muss für geometrische Objekte eine Vererbungshierarchie festlegen. Es geht um einfache geometrische Klassen wie: Kreis, Dreieck, Quadrat, Linie, Ellipse, Polygon etc. Diese sollten wenn möglich bereits etwas erben von einer Klasse Drawing oder so ähnlich. Es geht primär darum die Vererbung aufzuzeigen.

Wenn möglich sollten folgende Dinge enthalten sein:
- Extends
- Überschreiben von Methoden
- Verdecken von Attributen
- Aufruf des Konstruktors der Superklasse super()
- Unterbindung der Vererbung durch final

Macht es Sinn eine Klasse Drawing anzulegen als Superklasse und dann jeweils die einzelnen geometrischen Figuren als separate Subklassen zu behandeln? Ich frage mich dann, was in der Klasse Drawing alles enthalten sein sollte?

Danke für die Hilfe!
 

tfa

Top Contributor
Wann sollen die Klassen denn können? Vielleicht die Formen, die sie darstellen, malen? "Drawing" lässt das vermuten. Dann sollte diese Klasse vielleicht eine draw()-Methode haben.
Noch ein kleiner Tipp: Ein Quadrat ist kein Rechteck :)
 
T

TryToHelp

Gast
...
Diese sollten wenn möglich bereits etwas erben von einer Klasse Drawing oder so ähnlich. Es geht primär darum die Vererbung aufzuzeigen.
...
Diesem Satz nach sollten sie von einer (eventuellen abstrakten) Klasse Drawing erben, da könnten vielleicht attribute wie
Code:
Farbe
stehen und Funktionen wie
Code:
zeichnen

Desweiteren könnte eventuell Kreis von Elipse erben oder so und Quadrat von Rechteck welches wiederum von Viereck,...
 

Spewer

Aktives Mitglied
Ich würde mir eventuell überlegen eine Oberklasse für Formen zu machen, die mit der Zahl Pi in Zusammenhang stehen.
Zum Beispiel Flächeninhalte berechnen. Aber was sollen die Klassen denn genau können ?
 
T

TryToHelp

Gast
Ok, das mit Kreis und Elipse kann sein.
Aber Warum bitte ist ein Quadrat nicht ein spezielles Rechteck? also ich dachte immer ein Quadrat hat auch vier Rechte Winkel wie ein Rechteck, oder täusche ich mich da? Nur das es den Spezialfall hat, das alle 4 Seiten gleich lang sind ;-)
 

langhaar!

Bekanntes Mitglied
Mathematisch ist ein Quadrat ein Rechteck.

Objekte beinhalten aber neben Typen auch Methoden.
Und in diesem Sinn ist ein Quadrat kein Rechteck, da es nicht alle Methoden eines Rechecks besitzt.

Denn wenn ein Quadrat alle Methoden eines Rechecks hat, so kann man in einem Quadrat Länge und Breite einzeln setzen; und das kann nicht sein.
 

KSG9|sebastian

Top Contributor
Deshalb: Liskov substitution principle - Wikipedia, the free encyclopedia

Das Problem mit Quadrat und Rechteck:

Wenn ein Quadrat von Rechteck erbt dann wird der Vertrag zwischen Sub- und Superklasse gebrochen, weil die Subklasse nicht alle "Anforderungen" erfüllen kann.

Beispiel

Code:
class Rechteck{
   private int hoehe;
   private int breite;
  
   public Rechteck(int hoehe, int breite) {
       ...
   } 
 
   // getter und setter
}
class Quadrat extends Rechteck {
   public Quadrat(int seitenlaenge){
      super(seitenlanege, seitenlaenge);
   }
}

Alles schön und gut..aber was tust du bei setHoehe/setBreite? Methode überschreiben und immer beide Funktionen aufrufen?
Code:
public void setHoehe(int h){
   super.setHoehe(h);
   super.setBreite(h);
}
public void setBrerite(int b){
   super.setHoehe(b);
   super.setBreite(b);
}

Würde gehen.aber damit ist der "Vertrag" gebrochen.
Die Methode sagt: Setzt die Höhe des Rechtecks bzw setzt die Breite des Rechtecks.

Überschreibst du nun die Methode tut sie das aber nicht, bzw. tut zu viel. Wenn du nämliche die Höhe setzt wird die Breite auch gesetzt - das ist verwirrend..und führt zu unerwartetem Verhalten..z.B. folgendes


Code:
public int setzeUndBerechneFlaeche(int neueBreite, int neueHoehe, List<Rechteck> e){
   int gesamtFlaeche = 0;
   for(Rechteck eck : e){
      eck.setHoehe(neueHoehe);
      eck.setBreite(neueBreite);
      neueFlaeche += (neueBreite * neueHoehe);
   }
   return gesamtFlaeche;
}

// Aufrufer
List<Rechteck> e = new ArrayList<Rechteck>();
e.add(new Quadrat(2));
e.add(new Rechteck(3));

System.out.println(setzeUndBerechneFlaeche(2, 3, e));
// was würdest du hier erwarten? 15? oder 10?

Mein Code verstößt auch gegen die ein oder andere Regel, zeigt aber hoffentlich um was es geht..
 
T

TryToHelp

Gast
Ok, da habt ihr Recht, dann macht es wohl nur Sinn, eine Oberklasse
Code:
Drawing
zu erstellen ;-)
 

Oben