Übung 09: Vererbung und Dynamische Bindung

Ähnliche Dokumente
Musterübung 09: Vererbung und Dynamische Bindung

Übung Grundlagen der Programmierung WS 2008/09. Übung 04: Methoden. Abgabetermin: Prosabeschreibung Java-Programm.

Übung 10: Dynamische Datenstrukturen und Rekursion

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

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

JAVA für Nichtinformatiker - Probeklausur -

Fakultät IV Elektrotechnik/Informatik

Musterlösung Stand: 5. Februar 2009

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

16. Dezember 2004 Dr. M. Schneider, P. Ziewer

Objektorientierung (OO)

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Programmierung Nachklausurtutorium

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

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

Vererbung, Polymorphie

Vorkurs Informatik WiSe 15/16

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Aufgabe11. Methode test1. import java.util.hashmap; import java.util.arraylist; public class Aufgabe11 {

Programmiertechnik Übungen zu Klassen & -methoden

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

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

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

12 Abstrakte Klassen, finale Klassen und Interfaces

Javakurs für Anfänger

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Programmieren in Java

Rückblick VL Informatik I HS 2018

Objektorientierte Programmierung Studiengang Medieninformatik

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

Algorithmen und Datenstrukturen 07

II.4.2 Abstrakte Klassen und Interfaces - 1 -

14 Abstrakte Klassen, finale Klassen, Interfaces

4. Vererbung Die Klasse Object. Die Klasse Object

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

Überblick. Rekursive Methoden. Backtracking. Memorization. Einfache rekursive Datenstrukturen. Aufzählen, Untermengen, Permutationen, Bitmengen

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

14 Abstrakte Klassen, finale Klassen, Interfaces

Fragen zur OOP in Java

Prüfung Softwareentwicklung II (IB)

Klausur zur Lehrveranstaltung. Technische Informatik für Ingenieure WS 2008/09

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Programmierung für Mathematik HS11

Einführung in das Programmieren Probeklausur Lösungen

Informatik II Übung, Woche 17

Objektorientierte Programmierung Studiengang Medieninformatik

Einführung in die Programmierung

Klausur Algorithmen und Datenstrukturen I SS 03

Einstieg in die Informatik mit Java

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

6. Globalübung (zu Übungsblatt 8)

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015. Musterlösung

Probeklausur: Programmierung WS04/05

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Prüfung Softwareentwicklung II (IB)

Universität Karlsruhe (TH)

Objektorientierte Programmierung

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Einführung in C# Teil 3. Matthias Nübling

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Konzepte objektorientierter Programmierung

Programmieren in Java

Name:... Matr.-Nr... Bearbeitungszeit: 120 Minuten

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Erste Java-Programme (Scopes und Rekursion)

II.4.1 Unterklassen und Vererbung - 1 -

Einführung in die Programmierung für Wirtschaftsinformatik

Algorithmen und Programmierung II

Universität Paderborn Prof. Dr. Heike Wehrheim. Betreutes Arbeiten. Ab diese Woche: freitags, 14 16, E-Pool (während Tutorium Knopf) GPI, WS 07/08

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

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

Die Welt in unseren Programmen false -1.4E-12. false. Klassen

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Schwerpunkte. 10. Felder (Arrays) Grundprinzip von Arrays. Klassifikation von Typen in Programmiersprachen

Theorie zu Übung 8 Implementierung in Java

1 Abstrakte Klassen, finale Klassen und Interfaces

Programmieren in Java

Wiederholung. Klassenhierarchie:

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. Juni 2004

Letztes Mal. static int ggt(int a, int b) { if (a == b) return a; else if (a > b) return ggt(a-b,b); else if (a < b) return ggt(a,b-a);

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

3. Übungsbesprechung Programmkonstruktion

Informatik II Übung 6

Übungen zu Softwareentwicklung 1, WS 2009/10 Übung 6

Programmieren in Java

Kapitel 4: Klassen und Unterklassen

Java I Vorlesung Vererbung und Sichtbarkeit

Sortieren von Objekten

Abstrakte Klassen und Interfaces

Klassen, Vererbung, Benutzereingabe

Anweisungen zur Ablaufsteuerung

Transkript:

Übung 09: Vererbung und Dynamische Bindung Abgabetermin: TT.MM.JJJJ Name: Matrikelnummer: Gruppe: G1 (Prähofer) G2 (Prähofer) G3 (Wolfinger) G4 (Wolfinger) Aufgabe Punkte gelöst abzugeben schriftlich abzugeben elektronisch Aufgabe 09.X 12 Prosabeschreibung Java-Programm Java-Programm Testplan Testergebnisse Korr. Pkte Aufgabe 09.X: Graphische Objekte Realisieren Sie ein Klassensystem für graphische Objekte wie in der folgenden Abbildung dargestellt: GraphObject int x, y; elems * int w, h; Rectangle int r; Circle Composite GraphObject[] elems; int nelems; public addelem(graphobject go) public int getnelems() public GraphObject getelem(int i) Schreiben Sie eine Basisklasse GraphObject und Unterklassen Rectangle und Circle für graphische Objekte. GraphObjects haben eine Position. Rectangles haben zusätzlich eine Breite und Höhe, Circles einen Radius. Composites bestehen aus einer Reihe von Unterobjekten (elems), die in einem Array vom Typ GraphObject[] gespeichert werden. Methoden addelem, getnelem und getelem dienen zur Definition und zum Zugriff auf die Unterelemente. Neben Konstruktoren und Zugriffsmethoden sollen die Klassen folgende Operation implementieren: void draw(): zur Ausgabe mit Klasse Window boolean hit(int x, int y) : stellt fest, ob die Position x / y innerhalb des Objektes liegt. Gehen Sie bei der Lösung folgend vor: 1. Skizzieren Sie Klassen und die Methoden in Prosa. 2. Implementieren Sie die Klassen und die Methoden in Java 3. Testen Sie das Programm interaktiv

Prosabeschreibung: Klasse Point Int-Variablen x und y Konstruktor mit x und y als Parameter Klasse GraphObject Basisklasse für alle graphischen Objekte, abstract Feld name von Typ String Feld pos für Position vom Typ Point Konstruktor mit name als Parameter pos ist 0/0 Konstruktor mit name und x, y für Position Abstrakte Methode hit für Feststellen, ob gegebene Position x/y ein Treffer Abstrakte Methode draw für die Ausgabe auf Window Konkrete Methode move für das Verschieben um eine Distanz dx / dy Klasse Rectangle Klasse für Rechtecke, abgeleitet von GraphObject Felder w und h für Breite und Höhe Konstruktor mit name als Parameter pos ist 0/0, w und h sind 0 Konstruktor mit name und x, y für Position und w und h für Breite und Höhe Konkrete Methode hit die feststellt, ob innerhalb Rechteck Konkrete Methode draw für die Ausgabe auf Window Klasse Circle Klasse für Kreise, abgeleitet von GraphObject Feld r für Radius Konstruktor mit name als Parameter pos ist 0/0, r ist 0 Konstruktor mit name und x, y für Position und r für RAdius Konkrete Methode hit die feststellt, ob innerhalb Kreis Konkrete Methode draw für die Ausgabe auf Window Klasse Composite Klasse für zusammengesetzte Objekte, abgeleitet von GraphicObject Array mit GraphObject-Elementen Int-Variable für Menge der Elemente Konstruktor mit name als Parameter pos ist 0/0 Konstruktor mit name und x, y für Position Methode addelem, welches ein GraphObject anfügt; beim Anfügen wird die Position des Elementes relativ zu diesem zusammengesetzten Element betrachtet und die Position angepasst. Methode getelem(int i) für den Zugriff auf das ite-element Methode getnelems() für den Zugriff auf die Anzahl der Elemente Konkrete Methode hit die feststellt, ob innerhalb der Figur, geht sequentiell die Unterelemente durch Konkrete Methode draw für die Ausgabe auf Window, ruft draw für alle Unterelemente auf Konkrete Methode move für das Verschieben um eine Distanz dx / dy, wobei rekursiv move aller Elemente aufgerufen wird Klasse GraphicalObjects Testklasse mit main-methode; beinhaltet die Schleife mit Einlesen des Schusses und Ausgabe der Treffer Methode main: Aufbau einer Figur snowman als Composite In einer Schleife o Einlesen der Position des Schusses o Ausgabe, ob Treffer

Java-Programm: // Übungsprogramm graphische Objekte aufbauen und Enthaltensein prüfen import java.awt.color; class Point { int x; int y; abstract class GraphObject { String name; Point pos = new Point(); public GraphObject(String name) { this(name, 0, 0); public GraphObject(String name, int x, int y) { this.name = name; pos.x = x; pos.y = y; abstract public boolean hit(int px, int py); abstract ; public void move(int dx, int dy) { pos.x = pos.x + dx; pos.y = pos.y + dy; class Rectangle extends GraphObject { int w; int h; public Rectangle(String name) { this(name, 0, 0, 1, 1); public Rectangle(String name, int x, int y, int w, int h) { super(name, x, y); this.w = w; this.h = h; public boolean hit(int px, int py) { return px > pos.x && py > pos.y && px < pos.x + w && py < pos.y + h; { Window.fillRectangle(pos.x, pos.y, w, h, Color.LIGHT_GRAY); Window.drawRectangle(pos.x, pos.y, w, h); class Circle extends GraphObject { int r; public Circle(String name) { this(name, 0, 0, 1); public Circle(String name, int x, int y, int r) { super(name, x, y); this.r = r; public boolean hit(int px, int py) { double dpx = Math.abs(px - pos.x); double dpy = Math.abs(py - pos.y); double dist = Math.sqrt(dist = dpx * dpx + dpy * dpy); return dist < r;

public String tostring() { return ("Circle" + "(" + pos.x + "," + pos.y + "," +r + "): "+ name ); { Window.fillCircle(pos.x, pos.y, r, Color.LIGHT_GRAY); Window.drawCircle(pos.x, pos.y, r); class Composite extends GraphObject { final static int CAPACITY = 100; GraphObject[] elems = new GraphObject[CAPACITY]; int nelems = 0; public Composite(String name) { this(name, 0, 0); public Composite(String name, int x, int y) { super(name, x, y); public void addelem(graphobject elem) { elem.move(pos.x, pos.y); elems[nelems] = elem; nelems++; public GraphObject getelem(int i) { if (i >= 0 && i < nelems) { return elems[i]; else { return null; public int getnelems() { return nelems; @Override { for (int i = 0; i < nelems; i++) { elems[i].draw(); @Override public boolean hit(int px, int py) { for (int i = 0; i < nelems; i++) { if (elems[i].hit(px, py)) return true; return false; @Override public void move(int dx, int dy) { for (int i = 0; i < nelems; i++) { elems[i].move(dx, dy); super.move(dx, dy); public class GraphicalObjects { public static void main(string args[]) { Composite snowman = new Composite("Snowman"); snowman.add(new Rectangle("BeinL", 100, 300, 45, 100)); snowman.add(new Rectangle("BeinR", 155, 300, 45, 100)); snowman.add(new Circle("Body", 150, 250, 60)); snowman.add(new Circle("Kopf", 150, 160, 30)); Composite hut = new Composite("Hut", 130, 90); hut.add(new Rectangle("Hut1", 0, 30, 40, 10)); hut.add(new Rectangle("Hut2", 10, 0, 20, 30)); snowman.add(hut); snowman.add(new Rectangle("ArmL", 60, 210, 40, 30)); snowman.add(new Rectangle("ArmR", 200, 210, 40, 30)); snowman.move(10, 10);

Window.open(); snowman.draw(); int nrhits = 0; Point shot; shot = readshot(); while (shot!= null) { Window.drawPoint(shot.x, shot.y, Color.darkGray); if (snowman.hit(shot.x, shot.y)) { Out.println("Getroffen :-) "); nrhits++; else { Out.println("Verfehlt :-("); shot = readshot(); Out.println("Gratuliere: " + nrhits + " Treffer insgesamt!"); static Point readshot() { Out.println(); Out.print("Schuss (x y): "); Point p = new Point(); p.x = In.readInt(); p.y = In.readInt(); if (p.x >= 0 && p.y >= 0) return p; else return null; static GraphObject findhit(graphobject[] gos, Point shot) { for (int i = 0; i < gos.length; i++) { if (gos[i].hit(shot.x, shot.y)) { return gos[i]; return null;

Test: