Abstrakte Klassen, Interfaces und Pakete

Ähnliche Dokumente
Exceptions und Zugriffsmodifikatoren

Exceptions, Pakete und Zugriffsmodifikatoren

Programmierung Nachklausurtutorium

// compiliert, aber Programmabbruch zur Laufzeit: einesuppe = ((EßbarerPilz)einPilz).kochen();

Threads In dieser Übung beschäftigen wir uns mit der Realisierung von Threads in Java.

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Grafik-Programmierung

Programmieren 2 Java Überblick

Musterübung 09: Vererbung und Dynamische Bindung

Programmieren in Java

Hochschule Niederrhein Grundlagen der Prof. Dr. Nitsche. Bachelor Informatik SS 2017 Übung 2 Beispiellösung. Grundlagen von Java

Kapitel 5: Interfaces

Prüfung Softwareentwicklung II (IB)

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Wiederholung. Klassenhierarchie:

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Vererbung und Polymorphie

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Tutoraufgabe 1 (Seiteneekte):

Einführung in die Informatik. Lösung zu Übungsblatt 6

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Objektorientierte Programmierung Studiengang Medieninformatik

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Einstieg in die Informatik mit Java

II.4.5 Generische Datentypen - 1 -

Tutoraufgabe 1 (Seiteneekte):

Java Einführung Abstrakte Klassen und Interfaces

Universität Hamburg, Fachbereich Informatik Übungsblatt 11 zum Praktikum. E. Betke, N. Hübbe, M. Kuhn, J. Lüttgau, J. Squar im WiSe 2018/2019

Vorkurs Informatik WiSe 15/16

Programmieren in Java

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

Programmieren in Java

Abgabe: keine Pflichtabgabe (vor 12 Uhr) Aufgabe 10.1 (P) Vererbung Gegeben seien folgende Java-Klassen:

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Javakurs für Anfänger

Einführung in die Programmierung

Javakurs für Anfänger

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Abschnitt 14: Schnittstellen: Interfaces

1 Abstrakte Klassen, finale Klassen und Interfaces

Informatik II Übung, Woche 17

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

Abstrakte Klassen und Interfaces

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Übung 09: Vererbung und Dynamische Bindung

Grundlagen der Objektorientierung

Grafik-Programmierung

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

3. Übungsbesprechung Programmkonstruktion

Informatik Hochschule Mainz Geoinformatik und Vermessung. Wiederholung. Frohes Fest und Guten Rutsch!

Klausur Grundlagen der Programmierung

Informatik II. Übungsstunde 6. Distributed Systems Group, ETH Zürich

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Theorie zu Übung 8 Implementierung in Java

Grundelemente objektorientierter Sprachen (1)

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

Grundelemente objektorientierter Sprachen (1)

Arrays. Gilbert Beyer und Annabelle Klarl. Einführung in die Informatik. Zentralübung zur Vorlesung Einführung in die Informatik

Informatik II Übung 6

Objektorientierte Programmierung Studiengang Medieninformatik

Teil 2-3. Vorlesung. Modul: Programmierung B-PRG Grundlagen der Programmierung II

1. Laboraufgabe. Grafische Nutzerschnittstellen. Studiengang I / IEA / SAT

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmieren in Java

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Java-Schulung Grundlagen

Java für Bauingenieure

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 14/ / 492

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

Humboldt-Universität zu Berlin Wintersemester 2010/11 Institut für Informatik Grundlagen der Programmierung. 6. Übungsblatt

Tafelübung 07 Algorithmen und Datenstrukturen

Programmieren 2 Java Überblick

public static void replace(stringbuffer b) { for (int i = 0; i < b.length(); i++) { char replacechar; switch( b.charat(i) ) {

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Klassen und Konstruktoren in Java

Abstrakte Basisklassen

Objektorientierte Programmierung

Vererbung, Polymorphie

Software Entwicklung 1

Transkript:

Abstrakte Klassen, Interfaces und Pakete Vorbemerkung: Wir wollen allmählich die Basis für die Entwicklung (einfacher) Spiele in Java schaffen. Dazu erstellen wir in dieser Übung einige Schnittstellen für beliebige Spielobjekte auf einem zweidimensionalen Spielfeld. Dabei werden wir die Interfaces und abstrakte Klassen anwenden. Aufgabe 1: Positionen a) Schreiben Sie ein Interface Positionable, welches mindestens die folgenden Methoden deklariert: int getx(): lese die x Koordinate int gety(): lese die y Koordinate void move(positionable shift): verschiebe die Position um shift void moveto(positionable pos): setze die Position auf pos void scale(int factor): skaliere das Objekt (d.h. x und y Koordinate) um den Faktor factor void scale(int factorx, int factory): skaliere das Objekt (d.h. x und y Koordinate) um die jeweiligen Faktoren factorx bzw. factory Hinweis: Welche Methoden sind außerdem sinnvoll/erforderlich für Positionen? b) Implementieren Sie eine Klasse Position, welche das Interface Positionable implementiert. Hinweis: Sie können einfach die Klasse Point aus der 2. Übung entsprechend anpassen. Beachten Sie dabei, dass wir jetzt int statt double Koordinaten verwenden. Positionable +getx() : int +gety() : int +setx(int x) +sety(int y) +move(positionable shift) +moveto(positionable pos) +scale(int factor) +scale(int factorx, int factorx) -x : int -y : int implements Position +Position(int x, int y) +equals(object other) y p = (1, 4) p.moveto( q ) p.move( q ) (6, 2) (7, 6) Position p = new Position(1, 4); Position q = new Position(6, 2); p.move( q ); // p = (1,4) + (6,2) = (7, 6) p.moveto( q ); // p = (6, 2) x S. 1 / 8

Aufgabe 2: Pakete und Positionen Verschieben Sie das Interface Positionable in das Package (Paket) games.basic.position.interfaces und die Klasse Position in das Paket games.basic.position. Hinweis: Beachten Sie, dass Sie dazu auch die Klasse Position anpassen müssen, damit diese auf das Interface games.basic.position.interfaces.positionable zugreifen kann: Entweder Sie verwenden jeweils den vollständigen Interfacenamen oder ein entsprechendes import Statement. Aufgabe 3: Spielobjekte Zur Verwaltung und Bewegung von Spielobjekten auf dem Spielfeld betrachten wir zunächst die folgenden Eigenschaften als relevant: Die Position der linken oberen Ecke des Objektes Die maximale Breite des Objektes, d.h. dessen Ausdehnung in x Richtung Die maximale Höhe des Objektes, d.h. dessen Ausdehnung in y Richtung Diese Eigenschaften werden später zum Zeichnen und Bewegen der Spielobjekte benötigt und werden deshalb zunächst als Interface beschrieben. a) Erstellen Sie ein Interface games.basic.gameobjects.interfaces.simplegameobject, d.h. ein Interface SimpleGameObject im Paket games.basic.gameobjects.interfaces, mit den folgenden Methoden Positionable getpos() int getwidth() int getheight() pos = (6, 1) Dreieck pos = (1, 6) height = 3 y width = 2 x Kreis width = 4 height = 4 SimpleGameObject S. 2 / 8

Aufbauend auf diesen abstrakten Methoden können wir Methoden implementieren zum Bewegen von Spielobjekten auf dem Spielfeld sowie zum Vergleichen von deren Positionen, um beispielsweise Zusammenstöße erkennen zu können: b) Erweitern Sie Sie dazu das Interface SimpleGameObject zur Schnittstelle games.basic.gameobjects.interfaces.gameobject mit den zusätzlichen Methoden 1 boolean isleftof(gameobject other): befindet sich das Objekt (this) links vom anderen Objekt other? boolean isrightof(gameobject other) boolean isabove(gameobject other) boolean isbelow(gameobject other) boolean touches(gameobject other): überprüft, ob sich zwei Spielobjekte gegenseitig berühren, d.h. sich deren Positionen partiell überschneiden (wobei wir nur das umschließende Rechteck jedes Spielobjektes betrachten). c) Erstellen Sie nun eine (abstrakte) Klasse AbstractGameObject im Paket games.basic.gameobjects, welche die in GameObject deklarierten Methoden mit Hilfe der im Interface SimpleGameObject bereitgestellten Methoden implementiert. Hinweis: Implementieren Sie zunächst die Methoden isleftof und isabove. Diese können Sie dann bei der Implementierung der weiteren Methoden verwenden. d) Leiten Sie davon schließlich konkrete Klassen ab, die ebenfalls im Paket games.basic.gameobjects liegen sollen. RectangularGameObject zur Repräsentation rechteckiger Spielobjekte. Diese besitzen intern eine Breite (width) und Höhe (height). CircularGameObject zur Repräsentation kreisförmiger Spielobjekte. Diese besitzen intern einen Radius (radius), und die Breite und Höhe des Objektes entsprechen jeweils dem Kreisdurchmesser. 1 Hinweis: Nachfolgend werden wir nur noch das Interface GameObject verwenden. Das Interface SimpleGameObject dient hier lediglich zur Veranschaulichung der Vererbung von Interfaces. Wir hätten die Methoden aus SimpleGameObject folglich auch direkt im Interface GameObject deklarieren können. S. 3 / 8

SimpleGameObject extends GameObject +isleftof(gameobject other) : boolean +isrightof(gameobject other) : boolean +isaboveof(gameobject other) : boolean +isbelowof(gameobject other) : boolean +touches(gameobject other) : boolean implements AbstractGameObject -pos : Positionable +isleftof(gameobject other) : boolean +isrightof(gameobject other) : boolean +isaboveof(gameobject other) : boolean +isbelowof(gameobject other) : boolean +touches(gameobject other) : boolean extends RectangularGameObject -width : int -height : int +RectangularGameObject(Positionable, int, int) +equals(object other) : boolean -radius : int CircularGameObject +CircularGameObject(Positionable, int) +equals(object other) : boolean e) Schauen Sie noch einmal auf das Interface SimpleGameObject (und die implementierenden Klassen RectangularGameObject bzw. CircularGameObject). Können Sie etwas über die Position solcher Objekte aussagen? Hinweis: Wie können solche Objekte auf Position (08, 15) gesetzt werden? Erweitern Sie das Interface SimpleGameObject um dafür notwendige Methoden. S. 4 / 8

Zusatz Aufgabe 4: Bewegliche Spielobjekte Falls Sie noch Zeit und Lust haben, können Sie auch noch die folgende Aufgabe bearbeiten. Zur Bewegung von Spielobjekten dient die abstrakte Methode move(). Diese soll das Objekt gemäß eines Verschiebevektors deltapos in x und y Richtung verschieben, d.h. dessen Position entsprechend anpassen. move() move() x deltapos = (-3, 1) Moveable +move() +getdeltapos() : Positionable +setdeltapos(positionable shift) +reversexdirection() +reverseydirection() +reversedirection() y a) Erstellen Sie ein Interface games.basic.gameobjects.interfaces.moveable mit den folgenden Methoden void move() void setdeltapos(positionable shift) Positionable getdeltapos() void reversexdirection(): Ändert die Bewegungsrichtung void reverseydirection() void reversedirection() b) Implementieren Sie diese Methoden in einer (abstrakten) Klasse games.basic.gameobjects.moveable.abstractmoveablegameobject, welche Sie von AbstractGameObject ableiten können. Die Klasse soll c) Erstellen Sie schließlich (im Paket games.basic.gameobjects.moveable) zwei konkrete Klassen RectangularMoveableGameObject für rechteckige Spielobjekte, und Ship für eindimensionale Spielobjekte, d.h. Objekte mit Höhe = 1 und Breite = size (bei horizontaler Ausrichtung des Schiffes), bzw. Höhe = size und Breite = 1 (bei vertikaler Ausrichtung). S. 5 / 8

SimpleGameObject GameObject +isleftof(gameobject other) : boolean +isrightof(gameobject other) : boolean +isaboveof(gameobject other) : boolean +isbelowof(gameobject other) : boolean +touches(gameobject other) : boolean AbstractGameObject -pos : Positionable +isleftof(gameobject other) : boolean +isrightof(gameobject other) : boolean +isaboveof(gameobject other) : boolean +isbelowof(gameobject other) : boolean +touches(gameobject other) : boolean Moveable +move() +getdeltapos() : Positionable +setdeltapos(positionable shift) +reversexdirection() +reverseydirection() +reversedirection() AbstractMoveableGameObject -deltapos : Positionable +move() +getdeltapos() : Positionable +setdeltapos(positionable shift) +reversexdirection() +reverseydirection() +reversedirection() RectangularMoveableGameObject -width : int -height : int +RectangularMoveableGameObject( Positionable pos, int width, int height, Positionable deltapos) +equals(object other) : boolean Ship -size : int -ishorizontal : boolean +Ship(Positionable pos, int size, boolean ishorizontal, Positionable deltapos) +equals(object other) : boolean S. 6 / 8

Zusatz Aufgabe 5: Intelligenter Kühlschrank c) Schreiben Sie ein Interface Validity, welches mindestens die folgenden Methoden deklariert: boolean hasexpired(): Hat das Lebensmittel sein Haltbarkeitsdatum überschritten? int validity(): Haltbarkeit in Tagen (evtl. negativ!) b) Implementieren Sie eine Klasse AbstractFood, welche das Interface Validity implementiert. Hinweis: Dort soll die Methode hasexpired() in Abhängigkeit von der Haltbarkeit (validity()) implementiert werden. c) Erstellen Sie eine Klasse Food, welche von AbstractFood abgeleitet ist. Hinweis: Denken Sie an die Definition der benötigten Attribute (u.a. wird das Mindesthaltbarkeitsdatum bestbefore benötigt) und eines geeigneten Konstruktors. d) Verschieben Sie das Interface Validity in das Package (Paket) fridge.food.interfaces und die Klasse AbstractFood in das Paket fridge.food. Hinweis: Beachten Sie, dass Sie dazu auch die Klasse AbstractFood anpassen müssen, damit diese auf das Interface fridge.food.interfaces.validity zugreifen kann: Entweder Sie verwenden jeweils den vollständigen Interfacenamen oder ein entsprechendes import Statement. e) Verschieben Sie analog die anderen Klassen in das Paket fridge.food. S. 7 / 8

Zusatz Aufgabe 6 (für Java Experten): Java Rätsel Strings/Zahlen a) Rätsel (StringBuffer): Das folgende Programm gibt ein Wort aus unter Verwendung eines Zufallszahlengenerators, um das erste Zeichen auszuwählen. Beschreiben Sie das Verhalten des Programms: import java.util.random; public class Reim { private static Random rnd = new Random(); public static void main(string[] args) { StringBuffer word = null; switch (rnd.nextint(2)) { case 1: word = new StringBuffer('P'); case 2: word = new StringBuffer('G'); default: word = new StringBuffer('M'); word.append('a'); word.append('i'); word.append('n'); System.out.println(word); b) Rätsel (ungerade Zahlen): Die folgende Methode versucht zu ermitteln, ob die übergebene Zahl ungerade ist. Funktioniert diese Methode? public static boolean isodd(int i) { return i % 2 == 1; c) Rätsel (Hexadezimal Zahlen): Das folgende Programm addiert zwei Hexadezimal Zahlen und gibt das Ergebnis hexadezimal aus. Was gibt das Programm aus? public class JoyOfHex { public static void main(string[] args) { System.out.println( Long.toHexString(0x100000000L + 0xcafebabe)); S. 8 / 8