MINT lernen

Vererbung

Buch und DVD haben beide einen Titel und ein Erscheinungsjahr — warum sollte man das zweimal programmieren?

1

Ober- und Unterklasse

  • Vererbung:eine „ist ein“-Beziehung — ein Buch ist ein Medium.
  • Oberklasse:enthält, was alle gemeinsam haben (Generalisierung).
  • Unterklasse:erbt alle Attribute und Methoden der Oberklasse und ergänzt eigene (Spezialisierung).
  • Notation:Linie mit hohlem Dreieck an der Oberklasse; Geerbtes steht nur in der Oberklasse.
  • Sichtbarkeit:- private Attribute der Oberklasse erreicht die Unterklasse nur über Methoden; # (protected) erlaubt den direkten Zugriff.
  • Java:public class Buch extends Medium — genau eine Oberklasse.

Buch und DVD sind noch getrennt modelliert. Ziehe jede Zeile, die beide Klassen haben, nach oben in die Oberklasse Medium — mit der Tastatur: Zeile fokussieren, ↑ oder Enter schiebt sie hoch, ↓ holt sie zurück.

Gemeinsames nach oben


    

Halte fest: In die Oberklasse gehört nur, was alle Unterklassen haben. Eine Methode, die in jeder Unterklasse anders arbeitet, steht trotzdem oben — die Unterklassen überschreiben sie.

2

super, Überschreiben, Polymorphie

  • Konstruktor:erste Anweisung ist super(titel, jahr); — die Oberklasse setzt ihre Attribute selbst.
  • Überschreiben:gleicher Methodenkopf in der Unterklasse ersetzt die geerbte Methode; @Override lässt den Compiler das prüfen.
  • super.getInfo():ruft die Version der Oberklasse auf — die Unterklasse ergänzt nur ihren Teil.
  • Polymorphie:eine Variable vom Typ der Oberklasse darf auf ein Unterklassen-Objekt zeigen: Medium m = new Buch(…);
  • Dynamische Bindung:welche Methode läuft, entscheidet das Objekt, nicht der Typ der Variable.
Medium
  • - titel: Zeichenkette
  • - jahr: Ganzzahl
  • c Medium(titel: Zeichenkette, jahr: Ganzzahl)
  • + getTitel(): Zeichenkette
  • + getInfo(): Zeichenkette
Buch
  • - autor: Zeichenkette
  • c Buch(titel: Zeichenkette, jahr: Ganzzahl, autor: Zeichenkette)
  • + getInfo(): Zeichenkette
DVD
  • - laufzeit: Ganzzahl
  • c DVD(titel: Zeichenkette, jahr: Ganzzahl, laufzeit: Ganzzahl)
  • + getInfo(): Zeichenkette

getInfo() steht in allen drei Klassen: oben die allgemeine Fassung, unten die überschreibenden.

Herleitung:

Medium m = new Buch("Momo", 1973, "Ende");
| Typ prüfen
Ein Buch ist ein Medium — erlaubt. Über m sind nur Methoden aufrufbar, die Medium kennt.
m.getInfo()
| Objekt fragen
Zur Laufzeit zählt das Objekt: Es ist ein Buch, also läuft Buch.getInfo().
super.getInfo() + ", " + autor
| super auflösen
Medium.getInfo() liefert "Momo (1973)", dann wird der Autor angehängt.
"Momo (1973), Ende"
Ergebnis
Gleicher Aufruf, anderes Objekt, anderes Ergebnis — das ist Polymorphie.
public class Buch extends Medium {
    private String autor;

    public Buch(String titel, int jahr, String autor) {
        super(titel, jahr);          // zuerst die Oberklasse
        this.autor = autor;
    }
    @Override
    public String getInfo() {
        return super.getInfo() + ", " + autor;
    }
}
Medium[] regal = new Medium[3];
regal[0] = new Buch("Momo", 1973, "Ende");
regal[1] = new DVD("Paddington", 2014, 95);
regal[2] = new Medium("Stadtplan", 2021);
for (int i = 0; i < regal.length; i++) {
    System.out.println(regal[i].getInfo());
}
// Momo (1973), Ende
// Paddington (2014), 95 min
// Stadtplan (2021)
Merke

Vererbung: class Unter extends Ober — die Unterklasse erbt alles, ruft im Konstruktor zuerst super(…) auf und darf Methoden überschreiben. Beim Aufruf zählt der Typ des Objekts, nicht der Variable.

3

Allgemeine Hinweise

super zuerst

super(…) muss die erste Anweisung im Konstruktor sein. Fehlt er und hat die Oberklasse keinen Konstruktor ohne Parameter, übersetzt der Compiler die Unterklasse nicht.

private bleibt privat

In Buch führt return titel; zu einem Übersetzungsfehler, wenn titel in Medium privat ist. Nimm den Getter oder deklariere das Attribut mit # (protected).

Der ist-ein-Test

Vererbung nur, wenn der Satz „B ist ein A“ stimmt. Passt nur „A hat ein B“, ist es eine Assoziation — ein Auto ist kein Motor.

Videos