Logo der Hochschule  
 aufwärts

Probeklausur

Objektorientierte Programmierung (MI2)

In der Klausur wird geprüft, ob Sie die wichtigsten Ideen der objekt­orientierten Pro­grammierung in der Theorie verstanden haben und in der Praxis anwenden können.

Benutzen Sie in der Klausur eigenes Papier für Ihre Lösungen. Sie haben reichliche 2 Stunden Zeit zur Bearbeitung. Es sind keine Hilfsmittel erlaubt. Jede richtig gelöste Aufgabe ist mit 3 Punkten bewertet; 45 Punkte sind insgesamt erzielbar. Zum Bestehen sind mindestens 23 Punkte erforderlich. Für die Note 1,0 sind mindestens 41 Punkte erforderlich.

Aufgabe 1:  (Klasse)

Wir wollen einen Kreis in der Ebene mit den Koordinaten x und y und mit dem Durchmesser d repräsentieren (alle Werte ganzzahlig). Schreiben Sie eine Klasse Circle mit ent­sprechenden Attributen sowie mit einem Konstruktor, der ein ent­sprechendes Objekt erzeugt.

Aufgabe 2:  (Objekt)

Sie befinden sich im Haupt­programm. Deklarieren und erzeugen Sie zwei Kreise c0 und c1, also Objekte der Klasse Circle, beide mit den Koordinaten x=30 und y=50 und dem Durchmesser d=20.

Aufgabe 3:  (Methode)

Wir wollen den Durchmesser des Kreises um einen bestimmten Faktor f vergrößern, z.B um den Faktor f = 1,5. Schreiben Sie in der Klasse Circle eine Methode

public void enlarge(double f)

die den Durchmesser des Kreises this entsprechend vergrößert.

Aufgabe 4:  (Überladen einer Methode)

Wir benötigen sehr oft eine Veränderung des Durchmessers um einen bestimmten absoluten ganzzahligen Betrag, z.B. um den Betrag 10. Schreiben Sie hierzu eine weitere Methode enlarge. Geht das? Ober müssen Sie die Methode anders benennen?

Aufgabe 5:  (Referenz)

Sie haben in Aufgabe 2 den Kreis c0 erzeugt. Weil der Kreis c1 dieselben Koordinaten und denselben Durchmesser wie der Kreis c0 hat, schreiben Sie einfach

c1=c0;

Warum ist das nicht das, was eigentlich beabsichtigt ist? Was passiert, wenn Sie c1.enlarge(2.0) aufrufen?

Aufgabe 6:  (Ableiten einer Klasse)

Wir wollen als nächstes als weitere geometrische Objekte auch Rechtecke darstellen. Schreiben Sie also eine weitere Klasse Rectangle mit den Attributen x, y sowie w (Breite) und h (Höhe).

Die Klassen Circle und Rectangle haben die Gemeinsam­keit, dass sie eine x- und eine y-Koordinate aufweisen. Wir wollen daher die beiden Klassen von einer gemeinsamen Basisklasse Shape ableiten, die bereits diese x- und y-Koordinaten als Attribute aufweist.

Schreiben Sie die Klasse Shape. Welche Änderungen sind in Ihren Klassen Circle und Rectangle erforderlich, wenn Sie diese von Shape ableiten?

Aufgabe 7:  (Vererbung)

Wir wollen Kreise und Rechtecke in x- und y-Richtung verschieben, d.h. die x-Koordinate um einen Betrag dx und die y-Koordinate um einen Betrag dy vergrößern. Schreiben Sie in der Basisklasse Shape eine ent­sprechende Methode

public void offset(int dx, int dy)

Erklären Sie, indem Sie die Begriffe "erben" oder "vererben" benutzen, wieso wir nun sowohl Kreise als auch Rechtecke verschieben können.

Aufgabe 8:  (Abstrakte Klasse)

Erklären Sie, warum es sinnvoll ist, die Basisklasse Shape als abstrakte Klasse zu modellieren. Welche Auswirkungen hat dies?

Aufgabe 9:  (Abstrakte Methode)

Kreise und Rechtecke sollen sich um einen Faktor vergrößern lassen. Daher sollen beide Klassen eine Methode enlarge aufweisen. Um dies zu gewähr­leisten, deklarieren Sie in der abstrakten Basisklasse Shape die Methode

protected abstract void enlarge(double f);

Erklären Sie die Bedeutung dieser Zeile und deren Auswirkungen.

Aufgabe 10:  (Abstrakte Methode implementieren)

Sie erhalten jetzt in der Klasse Rectangle einen Fehler und den Hinweis "Add unimplemented methods". Warum? Was ist zu tun?

Aufgabe 11:  (Interface)

Erklären Sie die Gemeinsam­keiten und Unterschiede zwischen einem Interface und einer abstrakten Klasse.

Aufgabe 12:  (Über­schreiben einer Methode)

Schreiben Sie in der abstrakten Klasse Shape die Methode toString. Die Methode soll die x- und y-Koordinate, getrennt durch ein Komma, als String zurückgeben. Warum müssen Sie die Methode mit der Annotation @Override versehen?

Aufgabe 13:  (Über­schreiben einer Methode, super)

Die Anweisung

Rectangle r=new Rectangle(10, 20, 30, 40);

erzeugt ein Rechteck an Position x=10 und y=20 mit den Kantenlängen w=30 und h=40.

Über­schreiben Sie in der Klasse Rectangle die Methode toString, die ja bereits in der Basisklasse Shape definiert ist, in der Weise, dass sie nicht nur die x- und y-Werte, sondern alle diese vier Werte als String zurückgibt.

Können Sie dabei die Methode toString der Basisklasse Shape nutzen?

Aufgabe 14:  (Daten­struktur ArrayList)

Wir wollen ein Diagramm, bestehend aus gewissen Kreisen und Rechtecken, also Objekten der Klassen Circle und Rectangle, repräsentieren. Dazu wollen wir diese Kreise und Rechtecke gemeinsam in einer ArrayList speichern. Geht das? Welchen Typ-Parameter geben wir der ArrayList? Ergänzen Sie die folgende Anweisung zwischen den spitzen Klammern:

ArrayList<          > diagram=new ArrayList<          >();

Aufgabe 15:  (Polymorphie)

Wir wollen alle Objekte des Diagramms geringfügig vergrößern und schreiben:

for (Shape shape : diagram)
    shape.enlarge(1.05);

Funktioniert das? Woher weiß das Programm jeweils, ob es den Durchmesser eines Kreises oder die Kantenlängen eines Rechtecks vergrößern soll?