Blaubart: Abstrakte Klassen - wozu?

Beitrag lesen

'Nabend.

abstr. Klasse Person { getName(), getVorname(), getGeburtstag() }
Klasse Mitarbeiter:Person { getPersonalNummer(), getGehalt() }
Klasse Kunde:Person { getKundennummer(), getUmsatz() }

Du schreibst 1x die Methoden von Person, nämlich in der abstrakten Klasse und für Mitarbeiter sowie Kunde schreibst du nun nur noch die speziellen Methoden.

Das halte ich allerdings für kein besonders gutes Beispiel für abstrakte Klassen. Du demonstrierst damit lediglich, wie eine Kindklasse alle Eigenschaften seiner Elternklasse unverändert erbt und in zusätzlichen Methoden Funktionalität hinzufügt. Dazu muß die Elternklasse nicht notwendigerweise abstrakt sein.

Deutlicher wird der Nutzen abstrakter Klassen meiner Meinung nach erst in Kombination mit abstrakten Methoden (das paßt auch gut zum von dir erwähnten Plugin-Prinzip). Standardbeispiel geometrischer Gebilde, die z.B. auf dem Bildschirm gezeichnet werden sollen:

abstrakte Klasse Shape {
  color
  setColor() {
    // hier für alle Shapes implementieren
    ...
  }
  abstrakte Methode redraw() {
    // muß jeder konkrete Shape selber implementieren
  }
}

abgeleitete Klasse Circle {
  redraw() {
    // hier Implementierung, um einen Kreis zu zeichen
    ...
  }
}

abgeleitete Klasse Rectangle {
  redraw() {
    // hier Implementierung, um ein Rechteck zu zeichen
    ...
  }
}

usw.

Angenommen, alle dazustellenden Gebilde befinden sich in einer Liste, die Shapes speichert. Dann kann beim Neuzeichnen des Bildschirms einfach für jeden Shape die Methode redraw() aufgerufen werden. Jeder konkrete Shape (Circle, Rectangle usw.) zeichnet sich dann mit der richtigen Methode quasi selbst. Das deckt sich ja soweit mit Rouvens Erklärung. :)