Informatik

Rückblick

In diesem Kapitel ging es nicht um neue Sprachmittel, sondern um Entwurfsentscheidungen: Wann zieht man Gemeinsames nach oben? Wann genügt eine Zusicherung, wann braucht es eine gemeinsame Oberklasse? Genau danach wird in der Qualifikationsphase gefragt.

Das kann ich jetzt

  • Ich kann ein Implementationsdiagramm lesen und in ein Klassengerüst übersetzen – und umgekehrt. (1.1)
  • Ich kenne die Zeichen für die Sichtbarkeiten und weiß, was unterstrichen bedeutet. (1.1)
  • Ich kann Polymorphie an einem Beispiel erklären und sagen, wann entschieden wird, welche Methode läuft. (1.2)
  • Ich kann begründen, wann eine Klasse abstrakt sein sollte. (1.3)
  • Ich kann eine Schnittstelle von einer abstrakten Klasse unterscheiden und beide einsetzen. (1.4)

Aufgabe 3 gehört zum Leistungskurs, weil sie Schnittstellen verlangt.

Gemischte Aufgaben

Aufgabe 1: Diagramm lesen und schreiben

┌──────────────────────────────────┐
│         «abstract» Form          │
├──────────────────────────────────┤
│ # name : String                  │
├──────────────────────────────────┤
│ + Form(pName : String)           │
│ + gibName() : String             │
│ + berechneFlaeche() : double     │  ← abstrakt
│ + beschreibe() : void            │
└──────────────────────────────────┘

        ┌────────┴────────┐
┌───────────────┐  ┌──────────────────────┐
│    Kreis      │  │      Rechteck        │
├───────────────┤  ├──────────────────────┤
│ - radius:double│ │ - breite : double    │
│               │  │ - hoehe : double     │
└───────────────┘  └──────────────────────┘

a) Schreib das Klassengerüst zu Form und Kreis – ohne Methodenrümpfe, nur Köpfe, Sichtbarkeiten und Typen.

b) Warum ist name mit # gekennzeichnet und nicht mit -? Was wäre der Nachteil von -?

c) berechneFlaeche ist abstrakt. Was folgt daraus für Form, und was für jede Unterklasse?

d) beschreibe() ist nicht abstrakt, obwohl sie die Fläche ausgeben soll. Wie kann das funktionieren, wenn Form gar nicht weiß, wie man die Fläche berechnet?

Tipp zu d)

Eine nicht abstrakte Methode in der Oberklasse darf eine abstrakte Methode derselben Klasse aufrufen. Zur Laufzeit steht ja fest, welches Objekt gemeint ist – und damit auch, welche Fassung von berechneFlaeche gilt.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Aufgabe 2: Wer wird aufgerufen?

Form[] formen = new Form[3];
formen[0] = new Kreis(2.0);
formen[1] = new Rechteck(3.0, 4.0);
formen[2] = new Quadrat(5.0);
 
for (int i = 0; i < formen.length; i++) {
    formen[i].beschreibe();
}

Quadrat ist dabei eine Unterklasse von Rechteck.

a) Der Feldtyp ist Form, gespeichert sind drei verschiedene Klassen. Warum ist das erlaubt?

b) Welche berechneFlaeche-Fassung läuft in jedem der drei Durchläufe? Wann wird das entschieden?

c) Was passierte, wenn Quadrat die Methode berechneFlaeche nicht überschreibt?

d) Ergänze im Feld einen vierten Eintrag formen[3] = new Form("etwas");. Was meldet der Übersetzer, und warum ist das gut so?

e) Formuliere in einem Satz, was du mit Polymorphie gewinnst – gemessen an dem, was du ohne sie schreiben müsstest.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Aufgabe 3: Abstrakte Klasse oder Schnittstelle? (LK)

Entscheide für jeden Fall und begründe mit einem Kriterium aus der Vergleichstabelle.

a) Girokonto und Sparkonto haben beide einen Kontostand, eine Kontonummer und die Methoden einzahlen und abheben. Nur die Zinsberechnung unterscheidet sich.

b) Ein Programm soll Angestellter, Stromrechnung und Mietvertrag in einer gemeinsamen Liste verarbeiten, um daraus die monatlichen Ausgaben zu addieren. Gemeinsam ist ihnen nur, dass jedes einen Betrag liefern kann.

c) Alle Objekte, die sich der Größe nach ordnen lassen sollen, brauchen eine Methode istGroesserAls.

d) Warum ist es in Java ausgeschlossen, dass Angestellter von Mitarbeiter und von Bezahlbar erbt, wenn beides Klassen wären? Und wieso ist das mit einer Schnittstelle kein Problem?

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Selbsttest

Rückblick

Teilbare URL erstellen

Abschnitte auswählen