Drunt in der greana Au: Klasse, Objekte, Objektreferenzen

Dieses Jahr beginne ich meine zehnten Klassen wieder ganz anders, und zwar zum einem mit meinem GeisterGo-Projekt, zum anderen setze ich den Schwerpunkt gleich auf Objektreferenzen statt auf primitive Attributtypen. Wenn man mit diesen primitiven Typen (ganze Zahl, Kommazahl, Wahrheitswert) anfängt, sind die Schüler später total überrascht, dass ein Attribut oder allgemein eine Variable allgemein auch einen Objekttyp haben kann; wenn man gleich mit Objekttypen anfängt, geht das vielleicht leichter. Schauen wir mal.

Zum Üben bringe ich bald meine Ukulele mit, und wir singen zusammen “Drunt in der greana Au” (Wikipedia):

(Alle:) Drunt in da greana Au steht a Birnbam, sche blau, juche. / Drunt in da greana Au steht a Birnbam, sche blau.
(A:) Was is an dem Bam? (B:) A wunderschena Ast. (Alle:) Ast am Bam, Bam in der Au. / Drunt in da greana Au steht a Birnbam, sche blau, juche. / Drunt in da greana Au steht a Birnbam, sche blau.
(A:) Was ist an dem Ast? (B:) A wunderschens Astl. (Alle:) Astl am Ast, Ast am Bam, Bam in der Au. / Drunt in da greana Au …
(A:) Was is an dem Astl? (B:) A wunderschens Zweigerl. (Alle:) Zweigerl am Astl, Astl am Ast, Ast am Bam, Bam in der Au. / Drunt in …
(A:) Was ist an dem Zweigerl? (B:) A wunderschens Blattl. (Alle:) Blattl am Zweigerl, Zweigerl am Astl, Astl am Ast, Ast am Bam, / …
(A:) Was ist an dem Blattl? (B:) A wunderschens Nesterl. (Alle:) Nest am …
(A:) Was is in dem Nest? (B:) A wunderschens Oar. (Alle:) Oar im Nest, …
(A:) Was is in dem Oar? (B:) A wunderschens Vogerl. (Alle:) Vogerl im Oar, …
(A:) Was is an dem Vogerl? (B:) A wunderschens Federl. (Alle:) Federl vom …
(A:) Was wird vo dem Federl? (B:) A wunderschens Betterl. (Alle:) Betterl vom …
(A:) Wer liegt in dem Betterl? (B:) A wunderschens Maderl. (Alle:) Maderl im …
(A:) Wer liegt bei dem Maderl? (B:) A wunderschenes Buaberl. (Alle:) Buaberl …

Beim objektorientierten programmieren schreibt man nicht ein großes Programm, in das man alles unterbringt, sondern man packt die Informationen in kleine, möglichst selbstständige Häppchen, die Objekte. Ein Objekt verwaltet alle Informationen, die es braucht, und arbeitet mit anderen Objekten zusammen, um gemeinsam eine Aufgabe zu lösen. Vorlagen für diese Objekte sind Klassen. Und das Klassendiagramm zum Lied sieht so aus:

Klassendiagramm zum Lied

Das Diagramm liest man so: “Jedes Au-Objekt hat 1 Birnbaum-Objekt, mit dem es in Verbindung steht. Jedes Birnbaum-Objekt hat 1 Ast-Objekt, mit dem es in Verbindung steht.” Und so weiter.

Wenn das Programm dann mal läuft, arbeitet der Computer nicht mehr mit den Klassen, den Vorlagen, sondern mit konkreten Objekten, die anhand der Klassen-Vorlage erzeugt werden. Dann sieht die Situation so aus:

Objektdiagramm zum Lied

Das Diagramm liest man so: “Das Objekt o1 (vom Typ Au) hat eine Beziehung zum Objekt o2 (vom Typ Birnbaum). Das Objekt o2 hat eine Beziehung zum Objekt o3 (vom Typ Ast).” Und so weiter.

(Etwas ungeschickt am Beispiel ist, dass es zu jeder Klasse nur ein Objekt gibt. Eindeutiger ist es, wenn man aus einer Vorlage mehrere gleichartige Objekte erzeugt, denn dazu sind Vorlagen ja da.)

Die Aufgabe: Die Schülerinnen kriegen eine Programmierprojekt, in dem alle Klassen bereits unfertig vorhanden sind, und müssen sie so fertig programmieren, dass man als menschlicher Benutzer nur einmal ein Au-Objekt erzeugen muss, und das erzeugt dann selbstständig sein eigenes Birnbaum-Objekt, das wiederum selbstständig sein Ast-Objekt erzeugt, und so weiter. Dazu muss man nur den Konstruktor in jeder Klasse ergänzen, eine spezielle Methode, die beim Erzeugen eines Objekts verwendet wird.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Au
{
    Birnbaum baum;
 
    public Au()
    {
        baum = new Birnbaum();
    }
 
    void singen() {
        System.out.println("Drunt in der greana Au, steht a Birnbaum sche blau, juche!");
        System.out.println("Drunt in der greana Au, steht a Birnbaum sche blau.");
        baum.weitersingen();
    }
 
}

Vorgeben ist bereits eine Singen- beziehungsweise Weitersingen-Methode in allen Klassen, anhand derer man am Ende rasch überprüfen kann, ob wirklich überall der Konstruktor richtig programmiert wurde.

(Und später kann man das als Ausgangspunkt für die einfach verkettete Liste nehmen, und für Vererbung: Kann man nicht alle diese Klassen zusammenfassen unter, uh, “Liedelement”, und zumindest die Singen-Methode verallgemeinern?)

4 Antworten auf „Drunt in der greana Au: Klasse, Objekte, Objektreferenzen“

  1. Also mal unabhängig davon dass dieses Beispiel – wie die meisten einfachen – so simpel ist, dass aus meiner Sicht hier Objektorientierung überhaupt keinen Sinn macht. Aber ist ja zu Lernzwecken, also warum nicht ein bisschen Objekte verwenden.

    Ich würde vermutlich folgendes machen, so ganz kurz quick&dirty und noch nicht sonderlich durchdacht:

    - Eine Klasse Lied, davon ein Objekt instanziieren.
    Das Objekt hat ein Attribut Zeilen (ein Array aus Objekten der Klasse Zeile) dieses enthält eines bis n Objekte der Klasse Zeile (siehe unten).
    Das Lied-Objekt hat außerdem die Funktion “singen” (um gesungen zu werden). Diese Methode ruft in einer Schleife die “singen” Methode aller Zeilenobjekte auf.
    Attribute mit dem Namen des Lieds, dem Takt in bpm, dem Alter, ggf. dem Copyrightinhaber, Beschreibungen oder ähnlichem. Wie man mag.
    Vielleicht gibt es noch ein Attribut mit der Zeilenanzahl oder so.
    Zu den Attributen Getter-Funktionen dazu wenn man möchte.
    Die meisten Attribute kann man wenn man will auch in den Konstruktor übergeben. Andere im Konstruktor erst bauen.

    - Eine Klasse Zeile.
    Objekte dieser Klasse haben
    – den Zeileninhalt als String
    – die Länge der Zeile oder so
    – eine Funktion singen. Diese gibt die Zeile aus und wird vom Liedobjekt aufgerufen.

    In dem Beispiel kommen also vor:
    – Klassen
    – Objekte
    – Konstruktoren
    – Attribute mit verschiedenen Datentypen
    – Arrays aus Objekten

    Gruß
    Aginor

  2. Huch, da fehlt noch ein bisschen was. Die Zeileninhalte. Da könnte man im Konstruktor z.B. einen Hashwert übergeben, und die Klasse kennt alle möglichen Zeileninhalte und setzt den entsprechenden String als Zeileninhalt ein.
    Und wenn man eine Zeile will die noch keinen Index hat (die es also noch nicht gibt), dann gibt man einen optionalen Parameter an den Konstruktor, und ein weiteres Feld enthält dann den Inhalt.

    Fehlt bestimmt noch irgendwas. Wie gesagt das ist so zwischen Tür und Angel.
    Ich würde vielleicht doch eine MySQL-Datenbank dahinterhängen und die Zeilen sowie die Struktur des Lieds dort auslesen. :D

    Gruß
    Aginor

  3. Das Problem ist nur, dass das dann fast der der gesamte Stoff der 10. Jahrgangsstufe ist, und wir froh sind, wenn den alle können. (Fehlen noch: Zustandsübergangsdiagramme, Automaten, Vererbung.) Das ist zu viel auf einmal. In der Aufgabe oben geht es nur darum, Konstruktoren zu schreiben und innerhalb derer neue Objekte zu erzeugen. Das ist schon schwer genug. – Diese Objektorientierung ist trotz allem sehr, sehr abstrakt; vermutlich verlangt kein Fach so viel Abstraktion wie Informatik. Und wenn man mal weiß, wie das geht, vergisst man, wie unzugänglich das sein kann.

  4. Hmm.… State-machine und Vererbung würde man sicher auch noch unterkriegen! :D
    Ne, im Ernst, den Einwand kann ich gut verstehen. Man tendiert dazu zu vergessen wie kompliziert manche dieser Dinge sind, wenn man damit täglich arbeitet.

    Hatte auch ehrlich gesagt zwischendrin vergessen dass es für die zehnte Klasse ist. Die sind ja noch nicht so lange dabei mit Programmieren.

    Gruß
    Aginor

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.