Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Telecooperation/RBG Technische Universität Darmstadt Copyrighted material; for TUD student use only Grundlagen der Informatik 1 Thema 13: Vererbung, Funktionsvorlagen,

Ähnliche Präsentationen


Präsentation zum Thema: "Telecooperation/RBG Technische Universität Darmstadt Copyrighted material; for TUD student use only Grundlagen der Informatik 1 Thema 13: Vererbung, Funktionsvorlagen,"—  Präsentation transkript:

1 Telecooperation/RBG Technische Universität Darmstadt Copyrighted material; for TUD student use only Grundlagen der Informatik 1 Thema 13: Vererbung, Funktionsvorlagen, Späte Bindung Prof. Dr. Max Mühlhäuser Dr. Guido Rößling

2 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Wozu Vererbung? Inkrementelles Programmieren Definition neuer Objekttypen in Java Grundlagen des Package acm.graphics Modellierung eines Grafiksystems Abstrakte Klassen Schnittstellen Überschreiben bestehender Definitionen Späte Bindung der Methodenimplementierungen beim Operationsaufruf Inhaltsverzeichnis 2

3 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Wozu Vererbung? In T12 haben wir eine Begriffshierarchie definiert –Kunde und Mitarbeiter sind spezielle Personen Manager und Verwalter sind wiederum spezielle Mitarbeiter –Einfamilienhaus und Mehrfamilienhaus sind ein spezielles Haus Die Oberbegriffe (Haus, Person) haben bestimmte Eigenschaften, die alle Unterbegriffe ebenfalls haben –Person: z.B. Name, Vorname, Telefonnummer, … Mitarbeiter: Büro –Haus: Anschrift, Kaufpreis, Status, … Wir wollen das in Java ebenfalls nutzen –Attribute wie die obigen sollen nicht mehrfach definiert werden –Gemeinsame Methoden sollen nur einmal implementiert werden setName(String), setGivenName(String), setPhoneNumber(String),… 3

4 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Motivation für neue Objekttypen Die Klasse Person steht für allgemeine Personen Im Kontext der Immobilienverwaltung können wir erst mit konkreten Personen arbeiten, die eine Funktion haben –Die also Manager, Verwalter oder Kunden sind Wir wollen aber nicht immer konkret sagen, welche Art Person wir erwarten –Methode getPhoneNumber(Person p) hängt nicht davon ab, welche Art Person wir haben –Wir wollen diese Methode nicht mehrfach implementieren –Hier soll jede Art Person zum Typ Person passen! Gleichzeitig haben die Untertypen spezielle Funktionen –getListOfManagedClients() vs. getListOfHouses() etc. 4

5 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Vereinbarkeit verschiedener Klassen Mitarbeiter, Verwalter, Kunde, … sind eigene Klassen –Um die unterschiedliche Funktionalität sauber zu realisieren –Dennoch sollen sie wo nötig zu Person passen ( getName()) Gemeinsame Methoden nur einmal implementieren –Vermeidet Redundanz im Code –Reduziert die Anzahl der Fehlerquellen –Verbessert die Wartbarkeit und Wiederverwendbarkeit Passendes Konzept: Vererbung –Wir sagen Klasse Mitarbeiter erbt von Klasse Person Oder kürzer: Mitarbeiter erbt von Person 5

6 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Grundregeln der Vererbung I Regel 1: Vererbung beschreibt eine Spezialisierung –Der Erbe ist eine speziellere Form seines Vorfahren Ein Kunde ist eine spezielle Person –Umgekehrt ist der Vorfahr eine Verallgemeinerung seiner Erben Eine Person ist eine Verallgemeinerung für Kunde, Mitarbeiter, … Regel 2: Vererbung beschreibt eine ist-ein Beziehung –Ein Kunde ist eine (spezielle Art) Person –Ein Mehrfamilienhaus ist ein (spezielles) Haus Vererbung ist keine hat-ein Beziehung! –Ein Kunde hat ein (oder mehr als ein) Haus –Ein Kunde ist aber kein Haus –Für hat ein verwenden wir Attribute: die Klasse Kunde hat als Attribut eine Liste von Häusern 6

7 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Grundregeln der Vererbung II Regel 3: Eine Klasse erbt alle Methoden und Attribute ihres Vorfahren –Sie kann weitere Methoden oder Attribute definieren So hat ein Mitarbeiter noch eine Büronummer, die Person nicht hat Regel 4: Geerbte Methoden können neu definiert werden –Die Implementierung der Methode wird dabei überschrieben –Mehr dazu später in diesem Foliensatz Regel 5: Das grundsätzliche Verhalten des Erben in einer geerbten Methode sollte zu dem des Vorfahren passen –Unerwünschte Methoden kann man nicht wegdefinieren –Man sollte sie auch nicht durch Überschreiben mit leerem Körper (mache nichts) anpassen Beispiel: Kunde liefert bei getGivenName() immer nur null Die Abfrage des Vornamens einer Person kann nun Probleme erzeugen 7

8 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Unser Ziel: Neue Objekttypen Wir beschäftigen uns im Folgenden mit neuen Objekttypen Definition neuer Typen von Objekten Erzeugung und Benutzung neuer Instanzen (Objekte, Exemplare) dieser Typen Spezifikation allgemeiner Typen ohne direkte Funktionalität Anpassen geerbter Methoden durch Überschreiben 8

9 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Motivation für neue Objekttypen Motivation / Vorteile: –Komplexere Aktionen pro Befehl –Nähe zur natürlichen Sprache –Einfacher zu verstehen und ggf. zu korrigieren 9 Mentales Modell Design Modell niedriger Abstraktions- versatz modulare Struktur des Programms schmale Repräsentations- Lücke Maschinenebene Compiler

10 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Wozu Vererbung? Inkrementelles Programmieren Definition neuer Objekttypen in Java Grundlagen des Package acm.graphics Modellierung eines Grafiksystems Abstrakte Klassen Schnittstellen Überschreiben bestehender Definitionen Späte Bindung der Methodenimplementierungen beim Operationsaufruf Inhaltsverzeichnis 10

11 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Spezifikation neuer Objekttypen Neue Objekttypen werden inkrementell definiert –Über ihre Unterschiede zu existierenden Typen Spezialisierung von generelleren Konzepten Ein Manager ist eine spezielle Art Angestellter Anderer Ansatz: Gemeinsamkeiten verschiedener Objekttypen in einen gemeinsamen Super-Typ abstrahieren –Übergeordnete / Untergeordnete Konzepte Rechtecke und Dreiecke sind untergeordnete Konzepte von grafischen Objekten (können z.B. gezeichnet werden) 11 Eine neue Programmkomponente N wird konstruiert, indem man spezifiziert, wie sie sich von einer bestehenden Komponente B unterscheidet, ohne B dabei zu modifizieren.

12 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Inkrementelles Programmieren: Analogie 12 Stellen Sie sich vor, Sie haben die Folie B (Basis) auf dem Projektor und wollen daraus die Figur der Folie N (Neu) konstruieren, ohne dabei die Figur in B zu zerstören. Dafür würden Sie Folie M (Modifizierung) darüber legen. B M N Übereinander liegende Folien Am Ende gibt es sowohl B als auch N. Durch Auflegen von M wird B nur virtuell (nicht physisch) modifiziert.

13 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Inkrementelles Programmieren: Analogie 13 B M N Vorteile Arbeit- / Kostenminimierung: Nur die Differenz muss neu gezeichnet werden. B wird wieder verwendet. Fehlervermeidung: B ist benutzt und getestet worden. Beim Neu-Zeichnen könnten Fehler entstehen. Ähnliche Vorteile erwarten wir von der inkrementellen Programmierung in der Softwareentwicklung: –Software ist teuer. Wiederholte Entwicklung ist zu aufwändig. –Wiederverwendbarkeit ist ein wichtiges Thema in der Softwareindustrie.

14 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Sprachunterstützung für inkrementelles Programmieren Notwendige Sprachkonstrukte: Definition neuer Klassen als Erben existierender Klassen durch Vererbung das wahre neue Konzept von OOP Definition neuer Operationen und/oder Instanzvariablen Überschreiben von ererbten Operationen (Verhalten) 14

15 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Wozu Vererbung? Inkrementelles Programmieren Definition neuer Objekttypen in Java Grundlagen des Package acm.graphics Modellierung eines Grafiksystems Abstrakte Klassen Schnittstellen Überschreiben bestehender Definitionen Späte Bindung der Methodenimplementierungen beim Operationsaufruf Inhaltsverzeichnis 15

16 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Definition neuer Objekttypen in Java: Person 16 public class Person extends Object { String name; String givenName; String address; String phoneNr; // Konstruktor for Person objects public Person(String pName, String pGivenName, String pAddress, String pPhone) { name = pName; givenName = pGivenName; address = pAddress; phoneNr = pPhoneNr; } public String getName() { // returns the Persons name return name; } // Methods getGivenName(), setName(String) etc. } Schlüsselwort für Vererbung

17 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Definition neuer Objekttypen in Java 17 Die neue Klasse erbt alle Methoden und Attribute der Basisklasse und kann zusätzlich neue definieren. class extends { [Liste neuer Attribute] [Liste von Konstruktoren] [Liste neuer Methoden] } class Client extends Person { //... } Ein Client ist zunächst mal eine Person. Er hat alle Eigenschaften und bietet alle Dienste einer Person an.

18 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Definition neuer Objekttypen 18 public class Client extends Person { House house; // only one house for now... public Client(String name, String givenName, String address, String phone, House house) { setName(name); setGivenName(givenName); setAddress(address); setPhoneNumber(phone); this.house = house; } Bei der Definition neuer Dienste können bestehende Dienste benutzt werden: setName etc. von Person. this bezeichnet in Java das ausführende Objekt. Wenn klar ist, dass es um einen Methodenaufruf an this handelt, kann this auch weggelassen werden. Andere OO Sprachen haben ähnliche spezielle Bezeichner, z.B. self in Smalltalk. this.house ist das Attribut des Objekts, nicht der Parameter. Vorläufige Fassung

19 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Abstecher: Benennung neuer Methoden Bedeutung und Korrektheit neuer Methoden –Java versteht Methodennamen nicht, sondern führt aus –Die folgende Methode ist korrekt, aber nicht erwartungskonformund verwirrt damit Nutzer! public void getMyName() { System.err.println(myHouse); } Diese Methode sollte eher printHouseInfo() heißen –Folge: Intentionsfehler im Programm – Programm reagiert nicht wie erwartet. Methoden immer gemäß ihrer Bedeutung benennen! 19

20 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Konstruktoren und neue Objekttypen 20 Erben müssen einen Konstruktor der Oberklasse aufrufen Eine Unterklasse, die keinen Konstruktor definiert, hat implizit einen parameterlosen Konstruktor, der den parameterlosen Konstruktor der Oberklasse aufruft. public class Mitarbeiter extends Person { // Implementierung ohne expliziten Konstruktor } public class Mitarbeiter extends Person { Mitarbeiter() { super(); } //... } Das geht aber nur, wenn die Oberklasse einen parameterlosen Konstruktor definiert – sonst Compilefehler! (Passiert hier…) Schlüsselwort für Zugriff auf Element des Vorfahren, hier: Konstruktor

21 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Konstruktoren und neue Objekttypen 21 Person hat nur einen Konstruktor mit 4 Parametern Achtung: Anders als Methoden werden Konstruktoren nicht vererbt! Deswegen muss in Mitarbeiter ein expliziter Konstruktor implementiert werden, der den 4-parametrigen Konstruktor von Person aufruft. public class Mitarbeiter extends Person { int officeNumber; // office number public Mitarbeiter(String name, String givenName, String address, String phone, int officeNr) { super(name, givenName, address, phone); setOfficeNumber(officeNr); } // more features... } // Beispiel: Instanziierung eines Mitarbeiters Mitarbeiter mueller = new Mitarbeiter("Mueller", "Tim", "Hauptstr. 10, Darmstadt", " ", 10);

22 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Abstecher: Modellierungssprache 22 Mentales Modell Kleiner Abstraktions- sprung Design Modell modulare Struktur des Programms Kleine Repräsentations- lücke Maschinen-Level Compiler Modellierungssprache: eine grafische Notation (Sprache), in der wir Design-Modelle schreiben. Abstrakter als Programmiersprachen. Im Normalfall nicht ausführbar. Teile des Codes können aber aus dem Modell generiert werden.

23 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Abstecher: Unified Modeling Language (UML) Sprache und Notation für die visuelle Entwurfsbeschreibung von Modellen für Softwaresysteme –Festlegung, wie ein Softwaresystem konstruiert werden soll –Visualisierung, die auch für nicht-Informatiker leicht verständlich ist –Dokumentation von Software –Besonders wichtig, wenn ein großes System im Team entworfen wird UML bietet eine Sammlung von Diagrammtypen an, um bestimmte Aspekte der Software zu beschreiben –Anwendungsfalldiagramm: Was kann welcher Akteur mit dem System machen? –Klassendiagramm: Beschreibt Beziehungen zwischen Klassen –Verhaltensdiagramme: Beschreiben, wie sich das System verhalten soll. –Implementierungsdiagramme: Beziehungen zwischen Komponenten Wir betrachten im folgenden zunächst nur das Klassendiagramm 23

24 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Das UML Klassendiagramm 24 UML Notation für Methoden- Implementierung getOfficeNr(): int setOfficeNr(): void return officeNr; getSupervisedList(): … UML Notation für erbt UML Notation für Klasse name: String … setName(String): void... Person Mitarbeiter Manager Vererbung ist eine transitive Relation: Manager erbt alles, was Mitarbeiter erbt (z.B. setName(String) ) Klassendiagramm: Klasseneigenschaften - Attribute - Methoden Beziehungen: - Vererbung - (Teil-von) - (Abhängigkeiten)

25 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Wozu Vererbung? Inkrementelles Programmieren Definition neuer Objekttypen in Java Grundlagen des Package acm.graphics Modellierung eines Grafiksystems Abstrakte Klassen Schnittstellen Überschreiben bestehender Definitionen Späte Bindung der Methodenimplementierungen beim Operationsaufruf Inhaltsverzeichnis 25

26 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung eines Grafiksystems Im Folgenden verlassen wir die Immobilienverwaltung –Für OO-Modellierung zwar praktisch, aber nicht sehr interessant Stattdessen wollen wir ein Grafiksystem modellieren –Bestehend aus einer Zeichenfläche und grafischen Objekten Linie, Rechteck, Oval, Polygon, … Wir kehren dafür zur Package ACM JTF zurück –Siehe Foliensatz T11, Stichwort GraphicsProgram Wir werden für die Modellierung ACM JTF nutzen –Nehmen uns aber Zeit, selbst eine gute Modellierung zu finden –Diese ist nicht unbedingt deckungsgleich mit ACM JTF Es hat niemand behauptet, das Package sei perfekt… 26

27 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Nutzung von ACM JTF Grafik ACM JTF bietet mehr als Console, Dialog und Grafikausgabe –Ein (fast) komplettes Grafiksystem zum Zeichnen von Objekten Objekte werden in der Reihe ihres Erscheinens gezeichnet: Als Basis dient wieder das bewährte GraphicsProgram Wir nutzen aber zusätzliche Klassen für Grafikobjekte –Kreisbögen, Texte, Linien, Ovale, Rechtecke, Polygone 27

28 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Grundkonzepte für Grafik mit ACM JTF Für die Erstellung von Grafiken mit ACM JTF gilt: –Genutzt wird das gleiche Ausgabefenster wie in HelloGraphics –Das Koordinatensystem beginnt oben links mit (0,0) Die x-Achse wächst nach rechts, die y-Achse nach unten Jede Koordinate entspricht einem Bildschirmpunkt (Pixel) Als Koordinaten können int und double Werte genutzt werden Grundkonzepte zur Erstellung von Grafiken –Die Klasse GCanvas ist die Zeichenfläche –Die Klasse GObject ist die Basisklasse für alle grafischen Objekte –Zum Zeichnen wird ein grafisches Objekt dem GCanvas hinzugefügt Dazu dient die Methode add(GObject) der Klasse GCanvas Diese Methode ist in jedem GraphicsProgram direkt nutzbar Betrachten wir zunächst die grafischen Objekte… 28

29 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Grafische Objekte: Klasse GObject GObject ist die Basisklasse für alle Grafikobjekte –So wie Person die Basisklasse für Mitarbeiter, Kunde war ( T12) Besonders wichtige Methoden: –double getX(), double getY(), GPoint getLocation() Liefert die X- bzw. Y-Koordinate des Objekts bzw. die Position als Punkt –void setLocation(double x, double y), void setLocation(GPoint p) Setzt die Koordinate des Objekts als (x, y) oder über definierten Punkt –double getWidth(), double getHeight() Liefert die Breite bzw. Höhe des Objekts –GDimension getSize() Liefert die Größe des Objekts als GDimension-Objekt –GRectangle getBoundingBox() Liefert das kleinste Rechteck, das das Objekt vollständig umfasst 29

30 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Grafische Objekte: Klasse GObject Verschieben eines Objekts: –void move(double dx, double dy), void setLocation(GPoint p) Verschiebt das Objekt um ( dx, dy ) bzw. setzt es an Punkt p Ruft intern setLocation(getX() + dx, getY() + dy) auf –void movePolar(double r, double theta) Verschiebt das Objekt um r Einheiten Richtung theta (Winkelgrad) Farbe des Objekts auslesen oder setzen: –void setColor(Color c), Color getColor() Siehe die Java-Dokumentation von java.awt.Color Meist langen die folgenden vordefinierten konstanten Farbwerte: –Color.BLACK, Color.RED, Color.BLUE, Color.DARK_GRAY, Color.YELLOW, Color.MAGENTA, Color.GRAY, Color.GREEN, Color.ORANGE, Color.LIGHT_GRAY, Color.CYAN, Color.PINK, Color.WHITE Am Anfang der Klasse muss import java.awt.Color; stehen 30

31 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Grafische Objekte: Klasse GObject Beeinflussung der Zeichenreihenfolge –Normalerweise werden neue Objekte vorne gezeichnet –Um das anzupassen, gibt es vier Methoden: void sendToFront(), void sendToBack() –Ordnet das Objekt ganz vorne bzw. ganz hinten an void sendForward(), void sendBackward() –Bringt das Objekt eine Ebene nach vorne bzw. nach hinten Testen, ob ein Punkt im Objekt enthalten ist –boolean contains(double x, double y) boolean contains(GPoint p) Liefert true, wenn der Punkt im Objekt liegt, sonst false 31

32 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Anzeigefläche: GCanvas GraphicsProgram umfasst schon einen GCanvas Wesentliche Methoden in beiden Klassen: –void add(GObject go) Fügt das Objekt go zum GCanvas hinzu an der Position von go –void add(GObject go, double x, double y) void add(GObject go, GPoint p) Fügt das Objekt go zum GCanvas an angegebener Position hinzu –void remove(GObject go) Entfernt das grafische Objekt go vom GCanvas –void removeAll() Entfernt alle grafischen Objekte vom GCanvas –int getWidth(), int getHeight() Liefert die Breite bzw. Höhe des GCanvas 32

33 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Anzeigefläche: GCanvas void setBackground(Color bgColor) –Setzt die Hintergrundfarbe auf bgColor GObject getElementAt(double x, double y) GObject getElementAt(GPoint p) –Liefert das oberste Element, zu dem Punkt (x, y) bzw. p gehört –Ruft contains(x, y) bzw. contains(p) auf allen Objekten auf Beispiel (T11, Folie 20): // Anlege eines Objekts: GLabel fuer Texte GLabel label = new GLabel("hello, world"); // neuer Text // Schriftart zuweisen label.setFont("SansSerif-100"); // Font: ohne Serifen // Position berechnen und zum GCanvas hinzufuegen double x = (getWidth() - label.getWidth()) / 2; // mittig double y = (getHeight() + label.getAscent()) / 2; // mittig add(label, x, y); // Text hinzufuegen zum GCanvas 33

34 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Beispiel: zwei Objekte auf der Zeichenfläche import java.awt.Color; // fuer Farben import acm.graphics.GOval; // fuer das Oval import acm.graphics.GRect; // fuer das Rechteck import acm.program.GraphicsProgram;// Hauptklasse public class FeltBoard extends GraphicsProgram { public void run() {/** Runs the program */ GRect rect = new GRect(100, 50, 100, 100 / PHI); // Rechteck def. rect.setFilled(true);// ist gefuellt... rect.setColor(Color.RED);//...mit Farbe rot add(rect);// zum GCanvas hinzu GOval oval = new GOval(150, / PHI, 100, 100 / PHI); oval.setFilled(true);// ebenfalls gefuellt... oval.setColor(Color.GREEN);// aber gruen add(oval);// zum GCanvas hinzu } 34

35 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Beispiel: zwei Objekte auf der Zeichenfläche /** Constant representing the golden ratio */ public static final double PHI = 1.618; /* Standard Java entry point */ /* This method can be eliminated in most Java environments */ public static void main(String[] args) { new FeltBoard().start(args); } } Ausgabe (siehe Folie 27): Da das Rechteck älter ist, liegt es hinter dem später eingefügten Oval. 35

36 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Vorhandene Unterklassen von GObject GLine: Linie aus zwei Punkten –GLine(double x1, double y1, double x2, double y2) Legt die Linie von (x1, y1) nach (x2, y2) an –GPoint getStartPoint() GPoint getEndPoint() Liefert den Start- bzw. Endpunkt der Linie GOval: ovale Form –GOval(double x, double y, double w, double h) Oval mit linker oberer Ecke (x, y) und Radien w bzw. h GLabel: Text –GLabel(String text, double x, double y) Text text beginnend an Punkt (x, y) mit Basislinie y 36

37 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Vorhandene Unterklassen von GObject GArc: Kreisbogen; wie Oval, aber mit Start-/Endwinkel –GArc(double x, double y, double w, double h, double start, double sweep) Bogen mit linker oberer Ecke der Bounding Box an (x, y), Radien w bzw. h, Startwinkel start und Umfang sweep in Grad –Weitere Methoden zum Abfragen oder Setzen der Winkel GPolygon: Polygon mit beliebig vielen Knoten –GPolygon(double x, double y) Legt Polygon an Startposition ohne Knoten an –GPolygon(GPoint[] points) Legt Polygon mit Startknoten aus dem Array an –addEdge(double x, double y) Fügt Kante vom letzten Knoten zu (x, y) hinzu –void markAsComplete() Polygon als fertig markieren; kein Hinzufügen mehr möglich 37

38 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Vorhandene Unterklassen von GObject GRect: Rechteck in drei Varianten –GRect(double x, double y, double w, double h) Legt Rechteck mit Knoten (x,y) und (x+w, y+h) an –G3DRect(double x, double y, double w, double h) Legt Rechteck mit 3D-Effekt an Zusatzparameter: boolean raised; wenn true, erhöht gezeichnet –GRoundRect(double x, double y, double w, double h) Rechteck mit abgerundeten Ecken Zusatzparameter: –double arcSize – Größe des Bogens der Kanten –double arcWidth, double arcHeight – Individuelle Bogengröße GImage: Einbinden von Bildern –GImage(Image image, double x, double y) Legt ein Bild an; vorerst nicht weiter betrachtet 38

39 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Exkurs: Zeichnen von GObject-Instanzen Das Zeichnen von GObject-Instanzen erfolgt intern –Methode void paint(Graphics g), definiert in Klasse GObject –Graphics ist eine umfangreiche Klasse aus java.awt Bitte konsultieren Sie die Java API Dokumentation für Details! Zeichnen des Rechtecks (leicht vereinfacht) mit Graphics: public void paint(Graphics g) { // Zeichne Rechteck ab (x, y) mit Breite u. Hoehe g.drawRect(getX(), getY(), getWidth(),getHeight()); } Zeichnen eines Quadrats (leicht vereinfacht) mit Graphics: public void paint(Graphics g) { // Zeichne Quadrat ab (x, y) mit passender Groesse g.drawRect(getX(), getY(), size, size); } 39

40 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Wozu Vererbung? Inkrementelles Programmieren Definition neuer Objekttypen in Java Grundlagen des Package acm.graphics Modellierung eines Grafiksystems Abstrakte Klassen Schnittstellen Überschreiben bestehender Definitionen Späte Bindung der Methodenimplementierungen beim Operationsaufruf Inhaltsverzeichnis 40

41 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Finden der passenden Vererbungshierarchie Die Bestimmung der passenden Modellierung ist nicht immer offensichtlich Als Beispiel betrachten wir die folgenden Klassen als Teil eines Zeichensystems: –Punkt (GPoint) –Rechteck (GRect) –Gegebenfalls zusätzlich noch die Klasse Quadrat (GSquare) Wir betrachten nun verschiedene Modellierungen –Dabei begründen wir, warum die Modellierung (nicht) gut ist 41

42 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung I: Punkt als Basisklasse Überlegung: jedes grafische Objekt besteht aus mindestens einem Punkt Regel 1 der Vererbung: der Erbe ist eine Spezialisierung –Ist ein Rechteck ein spezieller Punkt? Was wir eigentlich meinten, war: ein Rechteck hat (mindestens) einen Punkt –Nutze einen GPoint als Attribut, nicht als Oberklasse –Siehe Regel 2 der Vererbung: ist-ein vs. hat-ein 42 GPoint GRect Keine gute Modellierung

43 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung II: Punkt neben Rechteck Punkt sollte nicht die Basisklasse von Rechteck sein –Andere grafische Objekte scheiden ebenso aus wie Punkt Wir definieren eine allgemeine Basisklasse GObject –Diese repräsentiert kein konkretes Objekt Konkrete Methoden wie paint lassen wir in GObject leer –Sammelt gemeinsame Funktionalität aller grafischen Objekte –Die konkreten Aufgaben, etwa das Zeichnen, leisten die Erben 43 GObject GPoint GRect

44 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung III: Rechteck und Quadrat Wie modellieren wir Rechteck und Quadrat? –Ein Quadrat ist spezieller als ein Rechteck –Daher könnten wir Quadrat als Erbe von Rechteck deklarieren 44 GSquare GObject GPoint GRect Ist das eine gute Modellierung?

45 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung III: Rechteck als Basis für Quadrat Achtung: Regel 3 und 5 der Vererbung –3: Neue Klasse erbt alle Methoden und Attribute der Basisklasse –5: Verhalten überschriebener Methode muss zu Vorfahr passen Quadrat erbt also alle Attribute und Methoden von Rechteck Damit auch die beiden Punkte oben links, unten rechts Sowie Methoden wie setWidth(double), setHeight(double) Wie stellen wir sicher, dass die Form quadratisch ist? Wie ändern wir die Methode zur Änderung der Größe? –Rechteck: zwei Zahlen oder ein Dimension-Objekt –Quadrat: eine Zahl –Die geerbte Methode von Rechteck muss es weiterhin geben –Wir können Sie höchstens umschreiben: public void setSize(double w, double h) { setSize((w + h) / 2); } Entspricht nicht der Vorstellung des Benutzers Regel 5 45

46 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung IV: Rechteck erbt von Quadrat Wie ist es umgekehrt: Rechteck erbt von Quadrat? –Rechteck übernimmt Größe und fügt zweite Größenangabe hinzu void setSize(double size) { setSize(size, size); } –Prinzipiell ist das möglich und verstößt nicht gegen Regel 3 und 5 –Aber: ein Rechteck ist eine Verallgemeinerung von Quadrat, eben keine Spezialisierung! Diese Vererbung ist also auch nicht geeignet Daher ordnen wir GSquare parallel zu GPoint, GRect ein 46

47 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Verwendung neuer Objekttypen Wir erweitern unsere Klasse FeltBoard (Folie 34-35): // Code bis Ende Methode "run" wie bisher add(oval);// zum GCanvas hinzu // neu: es kommt ein GSquare hinzu GSquare square = new GSquare(120, 80, 60); square.setColor(Color.BLACK); add(square); // Rest wie gehabt... 47

48 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Wozu Vererbung? Inkrementelles Programmieren Definition neuer Objekttypen in Java Grundlagen des Package acm.graphics Modellierung eines Grafiksystems Abstrakte Klassen Schnittstellen Überschreiben bestehender Definitionen Späte Bindung der Methodenimplementierungen beim Operationsaufruf Inhaltsverzeichnis 48

49 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Funktionsvorlagen & Abstrakte Klassen Betrachten wir die Klasse GObject einmal genauer Die Klassen GPoint, GRect und GSquare erben von GObject Dazu zählt auch die Methode void paint(Graphics g) –Wie implementiert man diese Methode für ein allgemeines GObject? –Wir wissen hier gar nicht, was für eine Art von Objekt dies sein soll! Für solche Fällen können Klassen Operationen deklarieren, die in der Klasse nicht implementiert werden. –Solche Operationen werden abstrakte Methoden genannt. –Klassen, die mindestens eine abstrakte Methode deklarieren, werden abstrakte Klassen genannt. Im Folgenden werden wir zeigen, wie abstrakte Klassen Wiederverwendung unterstützen, wenn ähnliche, aber nicht identische Aufgaben implementiert werden. 49

50 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Abstrakte Klassen: GObject GObject repräsentiert beliebige grafische Objekte –Also nichts konkretes wie einen Kreis, Quadrat, nur eine Vorlage GObject liefert allgemeine Funktionalität für alle Erben –Setzen und Abfragen der Koordinate und Farbe –Abfragen der Grenzen (bounds) –Zeichnen des Objekts mittels paint(Graphics) Nicht alle Methoden können implementiert werden –Wie kann man eine Vorlage zeichnen? Als Kreis, Quadrat, …? –Wie kann man für eine Vorlage die Grenzen angeben? Wie geht man mit dieser Situation um? –Was wollen wir? Jeder konkrete Erbe muss die beiden Methoden implementieren Die Überprüfung muss durch Java forciert werden, nicht nur durch (eventuell ignorierte) Kommentare im Quelltext 50

51 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Behandlung nicht-konkreter Methoden Möglichkeit 1: wir lassen diese Methoden in GObject leer public void paint(Graphics g) { } –Die Methode ist implementiert, aber ohne Funktionalität –Erben sollten paint implementieren, Java erzwingt das aber nicht Möglichkeit 2: wir implementieren sie irgendwie –Z.B. mit Ausgabe einer Fehlermeldung bei Aufruf, damit der Erbe sieht, dass das falsch war –Klassen compilieren normal, der Endkunde sieht dann die Fehler Wenn die Konsole nicht einfach minimiert wurde… –Das Programm verhält sich u.U. falsch Je nach Implementierung von getBounds() liefert getElementsAt() die falschen Objekte 51

52 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Abstrakte Methoden und Klassen in Java Eine nicht-konkrete Methode heißt abstrakt Markiert in Java durch abstract vor dem Rückgabetyp Abstrakte Methoden werden nur deklariert –Statt den geschweiften Klammern steht ein Semikolon ; public abstract void paint(Graphics g); Eine Klasse mit mindestens einer abstrakten Methode muss ebenfalls als abstract deklariert werden public abstract class GObject {... } Da die Klasse damit unvollständig ist, kann kein Objekt dieses Typs angelegt werden GObject go = new GObject(); // Fehler! 52

53 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Abstrakte Klassen und ihre Erben Der Erbe einer abstrakten Klasse… –erbt die Deklarationen aller abstrakten Methode(n) –kann abstrakte Methoden implementieren Siehe getBounds() und paint(Graphics) in GSquare Falls nicht alle abstrakten Methoden implementiert werden, bleibt auch der Erbe abstract –Selbst wenn die Methode nicht explizit im Klassenquelltext als abstract auftaucht, wir also etwa getBounds() in GSquare einfach weglassen Die konkrete Implementierung aller abstrakten Methoden erzeugt eine vollständig implementierte Klasse… –…von der dann konkrete Instanzen als Objekt existieren können 53

54 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Nutzung abstrakter Klassen 54 //... public void run() { // s. Folie 35 und 36 GRect rect = new GRect(100, 50, 100, 100 / PHI); rect.setFilled(true); rect.setColor(Color.RED); add(rect); GOval oval = new GOval(150, /PHI, 100, 100/PHI); oval.setFilled(true); oval.setColor(Color.GREEN); add(oval); } //... Denken wir kurz an den Code auf Folie 35f zurück: Die markierte Methode setColor wurde unverändert aus GObject geerbt Methode add ruft (unsichtbar) die Methode paint auf

55 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Abstrakte Klassen Gemeinsamkeiten in der gemeinsamen Superklasse GObject –Methode contains(double, double ) testet, ob ein Punkt im Objekt enthalten ist; nutzt getBounds() –getBounds() ist aber abstrakt 55 abstract class GObject extends Object{ //Konstruktor (versteckt) boolean contains(double x, double y){ return getBounds().contains(x, y); } abstract GRectangle getBounds(); } Unimplementierte Operation. Wird hier nur deklariert; bedeutet alle GObject s bieten den Dienst getBounds() an. Es ist aber nicht möglich, eine gemeinsame Implementierung anzugeben. Schablone-Operation (engl. template method. Ruft primitive abstrakte Operationen auf

56 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Erben von abstrakten Klassen 56 class GRect extends GObject{ double frameWidth, frameHeight; // Konstruktor etc... GRectangle getBounds() { return new GRectangle(getX(), getY(), frameWidth + 1, frameHeight + 1); } class GSquare extends GObject{ double frameSize; // Konstruktor etc... GRectangle getBounds() { return new GRectangle(getX(), getY(), frameSize + 1, frameSize + 1); } GRect und GSquare instanziieren die Vorlage unterschiedlich Nutze Breite und Höhe für das Ergebnis Nutze die Größe beide Mal für das Ergebnis

57 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Abstrakte Klassen in UML 57 GRect getBounds(): GRectangle GSquare getBounds(): GRectangle UML-Notation für abstrakte Klassen UML-Notation für abstrakte Methoden GObject contains(double, double): boolean getBounds(): GRectangle

58 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung V: Entkopplung der Klassen Analog zu Punkt und Rechteck können wir Rechteck und Quadrat entkoppeln 58 GSquare GObject GPoint GRect Das funktioniert problemlos Gemeinsamkeiten von Rectangle und Square verschwinden Beispielsweise können beide gefüllt sein und eine Füllfarbe besitzen Ein Punkt hingegen hat die Funktionalität nicht. Ist das eine gute Modellierung?

59 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Implementierung von GSquare Worauf ist beim Implementieren von GSquare zu achten? –Die Methode drawRect erwartet vier Parameter vom Typ int Runden der Koordinaten und Konvertieren nach int –Wir müssen Konstruktoren für GSquare definiert Sonst kann kein neues Objekt angelegt werden! Wir definieren zwei Konstruktoren: –Angabe nur der Größedie Startkoordinate ist damit (0, 0) –Angabe von Startpunkt und Größe Die Lösung der meisten dieser Probleme ist einfach –Siehe die beiden nächsten Folien für den Code 59

60 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Kompletter Code für GSquare package acm.graphics;// Gehoert zum Package acm.graphics import java.awt.Graphics;// benoetigt fuer paint(Graphics) public class GSquare extends GObject {// abgeleitet von GObject private double frameSize;// Groesse des Quadrats public GSquare(double size) {// Anlegen ohne Koord. -> (0, 0) this(0, 0, size);// Anderen Konstruktor aufrufen } public GSquare(double x, double y, double size) { frameeSize = size;// Groesse speichern setLocation(x, y);// Position setzen (von GObject) } public double getSquareSize() {// Groesse des Quadrats liefern return frameSize;// Groesse zurueckgeben } 60

61 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Kompletter Code für GSquare public GRectangle getBounds() { // Box berechnen return new GRectangle(getX(), getY(), frameSize+1, frameSize + 1); } public void paint(Graphics g) { // Zeichnen g.drawRect((int)GMath.round(getX()), (int)Math.round(getY()), (int)Math.round(frameSize), (int)Math.round(frameSize)); } Entsprechend können weitere Typen definiert werden wie GTriangle 61

62 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Wozu Vererbung? Inkrementelles Programmieren Definition neuer Objekttypen in Java Grundlagen des Package acm.graphics Modellierung eines Grafiksystems Abstrakte Klassen Schnittstellen Überschreiben bestehender Definitionen Späte Bindung der Methodenimplementierungen beim Operationsaufruf Inhaltsverzeichnis 62

63 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung VI: Abstraktes GFillableObject Wir können eine abstrakte Klasse für gefüllte Objekte definieren mit folgenden Eigenschaften: –boolean isFilled –Color fillColor –boolean isFilled(), void setFilled(boolean filled) –Color getFillColor(), void setFillColor(Color c) Alle Methoden sind implementierbar und vererbbar 63 GSquare GFillableObjectGPoint GRect GObject Ist das eine gute Modellierung?

64 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung VI: Abstraktes GFillableObject Prinzipiell ist diese Struktur sauber und funktioniert Aber: alle gefüllten Strukturen müssen nun von der Klasse GFillableObject oder einer Subklasse erben Wir können also nicht (sauber!) etwas entwerfen, … –… dass über eine Füllfarbe verfügt und optional gefüllt ist –… dass das Setzen der Füllfarbe und des Status erlaubt –… also identisch aussieht zu einem Erben von GFillableObject … –… aber nicht von GFillableObject erbt Etwa, weil es eine Spezialisierung eines anderen Typs ist Damit verbauen wir uns den Weg für spätere Klassen –Wir brauchen ein passendes Konzept, mit dem wir die Einfachvererbung von Java umgehen können –Auch wenn dies eventuell etwas Code-Redundanz erzeugt. 64

65 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Schnittstellen (engl. Interfaces) Schnittstellen deklarieren Operationen (Dienste), ohne diese zu implementieren –Eine Schnittstelle besteht nur aus Operationen-Signaturen: Rückgabetyp, Name der Operation, Liste der formalen Parameter und deren Typen Funktionale Abstraktion: das Was, aber nicht das Wie –Trennung der Typdeklaration von Implementierung 65 +operation(): void > AnInterface UML Notation Java syntax interface AnInterface { public void operation(); }

66 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Implementierung der Schnittstellen Eine Klasse, die eine Schnittstelle implementiert: –muss entweder alle dort deklarierten Operationen implementieren oder als abstract deklariert werden Die implementierenden Operationen behalten die Signatur der Schnittstelle bei und müssen public sein –kann zusätzliche Operationen definieren Mehrere Java-Klassen können dieselbe Schnittstelle auf verschiedene Weisen implementieren. In Java kann eine Klasse mehrere Schnittstellen implementieren. –Aber nur von einer Klasse erben! 66

67 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Implementierung der Schnittstellen 67 ClientClass ruft auf ImplClass1 AnInterface wird von ImplClass1 und ImplClass2 implementiert. ImplClass2 > AnInterface > AnotherInterface operation(): void +operation(): void UML Notation für implements class ImplClass1 implements AnInterface { public void operation () { //... }

68 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Schnittstellenvererbung Jede Schnittstelle kann von einer oder mehreren Superschnittstellen erben (Schlüsselwort extends ). Eine Klasse AClass, die eine Schnittstelle B implementiert, muss alle darin (und in den Superschnittstellen) deklarierten Operationen implementieren. –Sonst ist AClass weiter abstract 68 «interface» A «interface» B AClass operation1() operation2() operation3() operation1() operation2() operation3() interface B extends A { public void operation3(); }

69 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Variablen vom Schnittstellentyp 69 Analog zu Variablen vom Klassentyp können auch Variablen vom Schnittstellentyp deklariert werden Achtung: Schnittstellentypen können nicht instanziiert werden! class AnInterfaceClient { AnInterface aVariableName; //... void someOperation() { aVariableName = new AnInterface(); aVariableName = new ImplClass1(); aVariableName.operation(); } Eine Klasse, die Schnittstellentypen für die Deklaration einiger Variablen verwendet, kann wieder verwendet werden, solange die Variablen Objekte enthalten, deren Klassen die Schnittstelle implementieren. Fehler OK

70 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Schnittstellen und (abstrakte) Klassen Abstrakte Klassen gemeinsame Funktionalität ist zu definieren Schnittstellen es gibt einen gemeinsamen Typ, aber kein gemeinsames Verhalten Eine Klasse kann nur von einer direkten Superklasse erben (Einfachvererbung) der Missbrauch abstrakter Klassen als Schnittstellen hat einen wichtigen Effekt! Randnotiz: Es gibt Programmiersprachen, in denen eine Klasse von mehreren Superklassen erben kann (Mehrfachvererbung). –Hierbei treten oft Probleme mit Namenskonflikten auf, wenn gleiche Namen über verschiedene Vererbungspfade geerbt werden. –Bis dato gibt es keine zufriedenstellende Implementierung 70

71 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Schnittstellen und (abstrakte) Klassen Einfachvererbung zwingt Objekten ein einzelnes Klassifikationsschema auf. Die Nutzung von Schnittstellen entspannt diese Situation etwas: –Rechtecke kann man füllen und skalieren –Quadrate kann man füllen, aber nicht skalieren –Punkte kann man weder füllen noch skalieren 71 interface GFillable { // for fillable objects boolean isFilled(); void setFilled(boolean b); Color getFillColor(); void setFillColor(Color fillColor); } interface GScalable { // for scaling by one or separate factors void scale(double factor); void scale(double scaleX, double scaleY); } class GRect extends GObject implements GFillable, GScalable... class GSquare extends GObject implements GFillable... class GPoint extends GObject...

72 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung VII: Nutzung von Schnittstellen Wir deklarieren eine Schnittstelle GFillable Diese deklariert die Methoden zum Abfragen und Setzen des Füllstatus und der Füllfarbe Konsequenzen für Implementierer von GFillable: –Die Methoden müssen selbst implementiert werden Redundanz –Dafür besteht freie Wahl bei der Oberklasse Flexibilität 72 GSquare > GFillable GPoint GRect GObject

73 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Modellierung: Fazit Die Wahl der richtigen Oberklasse ist nicht offensichtlich Je nach Ziel und Kontext fällt die Wahl verschieden aus Mehrere Modellierungen waren nicht ratsam –Modellierung I: Punkt als Basisklasse für Rechteck Ein Rechteck ist kein Punkt, sondern hat (mehr als) einen Punkt –Modellierung II: Konkrete Klasse GObject mit leerem paint() Es gibt keine Garantie, dass alle Erben diese Methode implementieren –Modellierung III: Quadrat erbt von Rechteck Einige der geerbten Attribute und Methoden sind überflüssig und können für Probleme sorgen, etwa setWidth(double) –Modellierung IV: Rechteck erbt von Quadrat Rechteck ist Verallgemeinerung, keine Spezialisierung, von Quadrat –Modellierung VI: abstrakte Klasse GFillableObject Durchaus denkbar, schränkt aber die Vererbung sehr ein 73

74 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Wozu Vererbung? Inkrementelles Programmieren Definition neuer Objekttypen in Java Grundlagen des Package acm.graphics Modellierung eines Grafiksystems Abstrakte Klassen Schnittstellen Überschreiben bestehender Definitionen Späte Bindung der Methodenimplementierungen beim Operationsaufruf Inhaltsverzeichnis 74

75 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Überschreibung ererbter Methoden Methodenüberschreibung (engl. method overriding) geschieht, wenn zwei Methoden mit dem selben Namen, der gleichen Parameterzahl, und den gleichen Parametertypen in verschiedenen Klassen definiert werden, und eine die Superklasse der anderen ist. –Synonym für Verdecken Warum ist das sinnvoll? –Weil das Verhalten vorhandener Typen nur beinahe dem gewünschten entspricht. –Spezialisierung ist nicht reine Erweiterung… Rechtecke und Quadrate erben die Fähigkeit gezeichnet zu werden von einem gemeinsamen Vorfahren, werden aber auf verschiedene Art gezeichnet… 75 B M N

76 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Überschreiben ererbter Methoden 76 class GRect extends GObject implements...{ // Konstruktor etc... void paint(Graphics g) { Rectangle r = getAWTBounds(); if (isFilled()) { g.setColor(getFillColor()); g.fillRect(r.x, r.y, r.width, r.height); g.setColor(getColor()); } g.drawRect(r.x, r.y, r.width, r.height); } Die Methode paint in GRect nutzt die Methoden getColor(), getFillColor() class GStrangeRect extends GRect { // Konstruktor etc. Color getFillColor() { setColor(Color.BLUE); // ! return super.getFillColor(); } Wir schreiben ein komisches Rechteck, das diese Methoden modifiziert Was passiert hier?

77 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Überschreiben geerbter Methoden 77 class GStrangeRect extends GRect { //... Color getFillColor () { setColor(Color.BLUE); return super.getFillColor(); } } Alte Methode sind außerhalb der Neudefinition nicht zugreifbar! Verwendung der gerade überschriebenen Operation (z.B. der paint- Operation für den Obertyp) innerhalb der Neudefinition durch super Informell gesprochen: rufe die getFillColor() Version der GRect Variante von mir auf Technisch gesprochen: Führe die erste Implementierung von getFillColor() aus, die entlang der Kette meiner Ahnen existiert.

78 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Wozu Vererbung? Inkrementelles Programmieren Definition neuer Objekttypen in Java Grundlagen des Package acm.graphics Modellierung eines Grafiksystems Abstrakte Klassen Schnittstellen Überschreiben bestehender Definitionen Späte Bindung der Methodenimplementierungen beim Operationsaufruf Inhaltsverzeichnis 78

79 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 class GStrangeRect extends GRect { // Konstruktor etc. … // Verfaerbt sich vor dem Zeichnen void getFillColor() { setColor(Color.BLUE); return super.getFillColor(); } Auswahl einer Methode beim Operationsaufruf Bei dem Aufruf einer Operation OP an einem Objekt obj vom Typ ObjType muss eine entsprechende Methode ausgewählt und ausgeführt werden (method dispatch). In OO Sprachen werden die Operationsnamen dynamisch an Methoden gebunden. 79 Achtung! Was passiert beim Aufruf von paint(g) ?

80 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 public void run() { // inside FeltBoard (slide 35+) GRect rect = new GRect(100, 50, 100, 100 / PHI); rect.setFilled(true); rect.setColor(Color.RED); add(rect); // ruft mittelbar paint(g) auf GStrangeRect rect2 = new GStrangeRect(130,80,100,100/PHI); rect2.setFilled(true); rect2.setColor(Color.RED); add(rect2); // ruft mittelbar paint(g) } Auswahl einer Methode beim Operationsaufruf 80 Überschreiben von getFillColor() in GStrangeRect führt dazu, dass auch paint() sich seltsam verhält, wenn GStrangeRect es ausführt. Die Frage ist, warum?

81 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Auswahl einer Methode beim Operationsaufruf 81 rect2 Klasse Jedes Objekt kennt die eigene Klasse Erste Regel: Die Suche nach einer Implementierung für eine Operation beginnt in der Klasse des Empfängers und verläuft entlang der Vererbungshierarchie, bis eine Implementierung gefunden wird [oder in dynamisch typisierten Sprachen die Wurzel der Hierarchie erreicht wurde]. GRect getFillColor(): Color paint(Graphics): void... GStrangeRect getFillColor(): Color

82 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Aufruf der Methode paint(Graphics) 82 rect Klasse GRect getFillColor(): Color paint(Graphics): void... GStrangeRect getFillColor(): Color run() paint(g) if (isFilled) { g.setColor( getFillColor())... Der Aufruf von rect.paint(g) nutzt die Methode paint(g) in GRect Der Aufruf von getFillColor() geht wieder an den Typ GRect

83 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Aufruf der Methode paint(Graphics) 83 rect2 Klasse GRect getFillColor(): Color paint(Graphics): void... GStrangeRect getFillColor(): Color run() paint(g) if (isFilled) { g.setColor( getFillColor())... setColor(Color.BLUE); return super.getFillColor(); Aufruf von rect2.paint(g) sucht die Methode paint(g) in GStrangeRect Da sie dort nicht überschrieben wurde, nutzt man den Code von GRect Der Aufruf von getFillColor geht wieder an das Objekt rect2 Dieses nutzt nun die überschriebene Methode und setzt die Farbe um Am Ende wird noch die Methode aus super aufgerufen

84 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Überschreiben geerbter Methoden 84 Die Klasse GStrangeRect überschreibt die geerbte Methode getFillColor Die Methode in der Klasse GRect bleibt unverändert bestehen Der Methodenname getFillColor wird nicht für immer an den Code der Klasse GRect gebunden! Die Bindung erfolgt dynamisch: Java sucht bei Methodenaufrufen ausgehend vom Laufzeittyp des Objekts nach der ersten passenden Implementierung Daher wird bei Aufruf von rect2.paint(g) Für paint(g) der Code aus Klasse GRect genutzt Für die dort aufgerufene Methode der Laufzeittyp bestimmt Das ist GStrangeRect (da wir auf rect2 arbeiten) Dann wird die erste passende Methode genutzt Die stammt wiederum aus GStrangeRect

85 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Dynamische Bindung der Methoden 85 rect2 Klasse GRect getFillColor(): Color paint(Graphics): void... GStrangeRect getFillColor(): Color rect Klasse run() paint(g) Die Bindung erfolgt erst während der dynamischen Ausführung einer Aufgabe. Sie hängt ab vom Typ des Objekts, das die Nachricht bekommt.

86 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Bindung von super -Aufrufen 86 rect2 Klasse GRect getFillColor(): Color paint(Graphics): void... GStrangeRect getFillColor(): Color run() paint(g) if (isFilled) { g.setColor( getFillColor())... setColor(Color.BLUE); return super.getFillColor();

87 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Bindung von this - und super -Aufrufen 87 Zweite Regel: Die Suche für eine Implementierung für super-Aufrufen beginnt in der Super-Klasse der Klasse, in der der Aufruf sich befindet. Aufrufe über this werden spät (dynamisch) gebunden Aufrufe über super werden früh (statisch) gebunden

88 Dr. G. Rößling Prof. Dr. M. Mühlhäuser RBG / Telekooperation © Grundlagen der Informatik I: T13 Zusammenfassung Klassen können die Definition anderer Klassen erben, überschreiben und erweitern –Die wahre Neuigkeit der OOP –Unterstützt inkrementelles Programmieren Wiederverwendbarkeit Abstrakte Klassen ermöglichen die Definition von Funktionsvorlagen Wiederverwendbarkeit Schnittstellen trennen Typdeklarationen von Implementierungen Operationsnamen werden dynamisch an Implementierungen gebunden –Der Typ des Empfängers bestimmt die Auswahl –Gilt auch für Operationen an this Operationen an super werden statisch an die nächste Implementierung gebunden 88


Herunterladen ppt "Telecooperation/RBG Technische Universität Darmstadt Copyrighted material; for TUD student use only Grundlagen der Informatik 1 Thema 13: Vererbung, Funktionsvorlagen,"

Ähnliche Präsentationen


Google-Anzeigen