MINT lernen

Vererbung

Zwei Textaufgaben mit Hinweisen und Erwartungshorizont zu extends, super und überschriebenen Methoden.

Dein Fortschritt:
0 / 0 Aufgaben
1

Videos auf der Lernplattform

AFB I–II

Auf der Lernplattform der Schule können Videos hochgeladen werden. Erklärvideos für ein Unterrichtsfach sind besondere Videos: Sie heißen Tutorials und speichern zusätzlich das Fach. Die Plattform erzeugt ein Video v = new Video("Skate-Tricks", 12) und ein Tutorial t = new Tutorial("Brüche kürzen", 8, "Mathe").

Lukas hat vorher eine eigene Fassung der Unterklasse geschrieben, die javac nicht übersetzt (Material 3).

Material 1: Klassendiagramm
Video
  • - titel: Zeichenkette
  • - minuten: Ganzzahl
  • c Video(titel: Zeichenkette, minuten: Ganzzahl)
  • + getTitel(): Zeichenkette
  • + getMinuten(): Ganzzahl
  • + beschreibung(): Zeichenkette
Tutorial
  • - fach: Zeichenkette
  • c Tutorial(titel: Zeichenkette, minuten: Ganzzahl, fach: Zeichenkette)
  • + getFach(): Zeichenkette
  • + beschreibung(): Zeichenkette
Der Pfeil mit hohler Spitze zeigt zur Oberklasse.
Material 2: Die Klassen in Java
public class Video {
    private String titel;
    private int minuten;

    public Video(String titel, int minuten) {
        this.titel = titel;
        this.minuten = minuten;
    }

    public String getTitel() {
        return titel;
    }

    public int getMinuten() {
        return minuten;
    }

    public String beschreibung() {
        return titel + " (" + minuten + " min)";
    }
}

public class Tutorial extends Video {
    private String fach;

    public Tutorial(String titel, int minuten, String fach) {
        super(titel, minuten);
        this.fach = fach;
    }

    public String getFach() {
        return fach;
    }

    @Override
    public String beschreibung() {
        return fach + ": " + super.beschreibung();
    }
}
Jede Klasse steht in einer eigenen Datei.
Material 3: Lukas’ Fassung (Ausschnitt)
public Tutorial(String titel, int minuten, String fach) {
    this.fach = fach;
    super(titel, minuten);
}

public String kurz() {
    return titel;
}
javac meldet zwei Fehler.
  1. Ordne jede Methode, die ein Tutorial-Objekt aufrufen kann, einer der Gruppen „geerbt“, „neu“ oder „überschrieben“ zu.
  2. Bestimme die Ergebnisse von v.beschreibung(), t.beschreibung(), t.getMinuten() und v.getFach().
  3. Erläutere die beiden Fehler in Lukas’ Fassung (Material 3) und wie man sie vermeidet.

Hinweise

Hinweis zu Aufgabe a)
Ein Tutorial „ist ein“ Video: Es kann alle öffentlichen Methoden der Oberklasse nutzen. Welche Methode steht in beiden Karten?
Hinweis zu Aufgabe b)
Es läuft immer die Methode der Klasse, zu der das Objekt gehört. super.beschreibung() ruft die Fassung der Oberklasse auf. Hat ein Video ein Fach?
Hinweis zu Aufgabe c)
Wo muss der Aufruf des Oberklassen-Konstruktors stehen? Und wer darf auf ein private-Attribut zugreifen – auch eine Unterklasse?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

Geerbt: getTitel(), getMinuten(). Neu: getFach(). Überschrieben: beschreibung() – gleiche Signatur wie in Video, gekennzeichnet mit @Override.

Erwartungshorizont zu Aufgabe b)

v.beschreibung() → "Skate-Tricks (12 min)" (Fassung von Video).

t.beschreibung() → "Mathe: Brüche kürzen (8 min)": Die überschriebene Fassung von Tutorial läuft und setzt das Fach vor das Ergebnis von super.beschreibung().

t.getMinuten() → 8 (geerbt).

v.getFach() wird nicht übersetzt: cannot find symbol. Die Oberklasse kennt die Methoden ihrer Unterklassen nicht – vererbt wird nur von oben nach unten.

Erwartungshorizont zu Aufgabe c)

Fehler 1: super(titel, minuten); muss die erste Anweisung im Konstruktor sein (call to super must be first statement in constructor). Erst wird der Video-Teil des Objekts eingerichtet, dann der Tutorial-Teil. Lösung: die beiden Zeilen tauschen.

Fehler 2: titel ist in Video private. Auch die Unterklasse darf nicht direkt darauf zugreifen (titel has private access in Video). Lösung: den geerbten Getter benutzen, return getTitel();.

2

Livestream vom Schulkonzert

AFB II–III

Die Plattform aus Aufgabe 1 soll auch Livestreams zeigen, z. B. vom Schulkonzert. Ein Livestream hat wie jedes Video einen Titel und eine geplante Länge in Minuten. Zusätzlich zählt er die Zuschauerinnen und Zuschauer (Start bei 0) und weiß, ob er gerade live ist (zu Beginn: ja). Er kann beendet werden. Die Beschreibung lautet während der Sendung z. B. LIVE: Schulkonzert – 3 schauen zu, danach Aufzeichnung: Schulkonzert (90 min).

Ein Mitschüler schlägt außerdem vor, eine Klasse Kanal (z. B. der Kanal der Theater-AG mit all seinen Videos) als class Kanal extends Video anzulegen, „weil ein Kanal ja auch einen Titel hat“.

  1. Entwirf die Klassenkarte der Klasse Livestream und zeichne ihre Beziehung zu Video ein. Nimm nur auf, was neu oder überschrieben ist.
  2. Implementiere die Klasse Livestream so, dass die Beschreibungen genau wie im Text aussehen.
  3. Nimm Stellung zum Vorschlag class Kanal extends Video.

Hinweise

Hinweis zu Aufgabe a)
Titel und Minuten erbt der Livestream. Neu: zwei Attribute und passende Methoden. Welche Methode muss sich anders verhalten?„Entwerfen“ heißt: selbst festlegen, welche Attribute und Methoden nötig sind.
Hinweis zu Aufgabe b)
Konstruktor mit super(…) in der ersten Zeile. Für den Titel brauchst du den Getter. Die „Aufzeichnung“-Beschreibung kann super.beschreibung() nutzen.
Hinweis zu Aufgabe c)
Mache den „ist ein“-Test: Ist ein Kanal ein Video? Was würde ein Kanal alles erben – passt das? Welche Beziehung besteht stattdessen zwischen Kanal und Video?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
Video
  • …
Livestream
  • - zuschauer: Ganzzahl
  • - live: Wahrheitswert
  • c Livestream(titel: Zeichenkette, minuten: Ganzzahl)
  • + zuschauerKommt()
  • + beenden()
  • + getZuschauer(): Ganzzahl
  • + beschreibung(): Zeichenkette

Methodennamen dürfen abweichen. Titel und Minuten stehen nicht noch einmal in der Karte, weil sie geerbt werden; beschreibung() steht dort, weil sie überschrieben wird.

Erwartungshorizont zu Aufgabe b)
public class Livestream extends Video {
    private int zuschauer;
    private boolean live;

    public Livestream(String titel, int minuten) {
        super(titel, minuten);
        zuschauer = 0;
        live = true;
    }

    public void zuschauerKommt() {
        zuschauer = zuschauer + 1;
    }

    public void beenden() {
        live = false;
    }

    public int getZuschauer() {
        return zuschauer;
    }

    @Override
    public String beschreibung() {
        if (live) {
            return "LIVE: " + getTitel() + " – " + zuschauer + " schauen zu";
        }
        return "Aufzeichnung: " + super.beschreibung();
    }
}

Test: new Livestream("Schulkonzert", 90), dreimal zuschauerKommt() → LIVE: Schulkonzert – 3 schauen zu; nach beenden() → Aufzeichnung: Schulkonzert (90 min).

Erwartungshorizont zu Aufgabe c)

Prüfung: Vererbung passt nur, wenn die Unterklasse eine besondere Art der Oberklasse ist. „Ein Kanal ist ein Video“ ist falsch: Ein Kanal enthält viele Videos. Mit extends erbte der Kanal getMinuten() und beschreibung() – eine Länge in Minuten hat ein Kanal aber gar nicht. Dass beide einen Titel haben, reicht für Vererbung nicht.

Position: Der Vorschlag ist abzulehnen. Besser ist eine eigene Klasse Kanal mit einem Namen und einer ArrayList<Video>; zwischen Kanal und Video besteht eine „hat“-Beziehung (Assoziation). Jede begründete Position, die den „ist ein“-Test anwendet, ist vollständig.