Praktikum Entwicklung und Einsatz von Geosoftware I • Sitzung 5: Polymorphismus Sommersemester 2004 Jan Drewnak 18.05.2004 Sitzung 5 Anmerkungen Aufgabe 3 • e-mail mit Lösungen (an Arne und mich): • nur Source-Dateien (*.java), keine kompilierten Klassendateien • alle Klassen, die zum Kompilieren notwendig sind (z.B. Punktklasse) • ab jetzt: Jede Klasse in einer eigenen .java-Datei • Tabulator zum Einrücken verwenden, nicht Leertaste(Space) • Kapselung: • erstmal: alle Member einer Klasse (Attribute + Operationen) private • dann: welche Operationen (fast nie: Attribute) sollen von außen nutzbar sein? public 18.05.2004 Polymorphismus Musterlösung Aufgabe 3 - Entwurf • Wie soll die Klasse heißen? 1. Was repräsentiert sie? Eine BoundingBox! 2. Was steht in der Aufgabe? BoundingBox! • Welche Attribute hat eine BoundingBox? • 18.05.2004 ist ein Rechteck; wird definiert durch zwei Punkte (links unten und rechts oben): Point lowerLeft; Point upperRight; Polymorphismus Musterlösung Aufgabe 3 - Entwurf • Welche Konstruktoren braucht eine BBox? = Wie kann ich eine BoundingBox anlegen? = Welche Angaben werden zum Anlegen einer BoundingBox benötigt? • Variante A: 2 Punkte public BoundingBox(Point lowerLeft, Point upperRight) • Variante B: Punkt-Liste ( Aufgabenstellung!!!) public BoundingBox(Point[] pointList) • Variante C: … 18.05.2004 Polymorphismus Musterlösung Aufgabe 3 - Entwurf • Welche Operationen möchte ich mit der BBox durchführen können? ( Aufgabenstellung!!!) • Eckpunkte abfragen public Point getLowerLeft() public Point getUpperRight() • Höhe und Breite ermitteln public double getHeight() public double getWidth() • Textuelle Repräsentation abrufen (zur Ausgabe auf der Konsole etc.) public String toString() 18.05.2004 Polymorphismus Musterlösung Aufgabe 3 - Entwurf • Darstellung des Entwurfs in der Unified Modeling Language (UML) Assoziation ("besitzt Attribut vom Typ") Klasse Klassenname Attribute Methoden 18.05.2004 Polymorphismus public class BoundingBox { //Attribute (bzw. Variable): private Point pointLowerLeft; private Point pointUpperRight; Musterlösung Aufgabe 3 //Constructor public BoundingBox(Point[] pointCloud){ double double double double llx lly urx ury = = = = pointCloud[0].getX(); pointCloud[0].getY(); pointCloud[0].getX(); pointCloud[0].getY(); for(int i=0; i<pointCloud.length; i++){ if( pointCloud[i].getX() < llx){ llx = pointCloud[i].getX(); } if( pointCloud[i].getY() < lly){ lly = pointCloud[i].getY(); } if( pointCloud[i].getX() > urx){ urx = pointCloud[i].getX(); } if( pointCloud[i].getY() > ury){ ury = pointCloud[i].getY(); } } pointLowerLeft = new Point(llx, lly); pointUpperRight = new Point(urx, ury); } 18.05.2004 Polymorphismus Musterlösung Aufgabe 3 /** * gibt den linken, unteren Eckpunkt der BoundingBox zurück. */ public Point getLowerLeft(){ return pointLowerLeft; } /** * gibt den rechten, oberen Eckpunkt der BoundingBox zurück. */ public Point getUpperRight(){ return pointUpperRight; } /** * gibt ein String-Format der BoundingBox zurück. */ public String toString(){ return "(" + pointLowerLeft + " , " + pointUpperRight + ")"; } 18.05.2004 Polymorphismus /** Musterlösung * liefert die Hoehe derAufgabe BoundingBox. 3 * Falls die BoundingBox nicht korrekt intanziert wurde liefert die Methode -1. */ public double getHeight(){ //Fall: BoundingBox wurde nicht korrekt intanziert -> die Eckpunkte sind null if((pointLowerLeft == null) || (pointUpperRight == null)){ return -1; } else{ return pointUpperRight.getY() - pointLowerLeft.getY(); } } /** * liefert die Breite der BoundingBox. * Falls die BoundingBox nicht korrekt intanziert wurde liefert die Methode -1. */ public double getWidth(){ //Fall: BoundingBox wurde nicht korrekt intanziert -> die Eckpunkte sind null if((pointLowerLeft == null) || (pointUpperRight == null)){ return -1; } else{ return pointUpperRight.getX() - pointLowerLeft.getX(); } } } //Class BoundingBox 18.05.2004 Polymorphismus Musterlösung Aufgabe 3 class BoundingBoxApplication{ public static void Point p1 = new Point p2 = new Point p3 = new main(String[] args) { Point(1.0, 2.0); Point(4.0, 6.0); Point(3.0, 5.0); Point[] pCloud = new Point[3]; pCloud[0] = p1; pCloud[1] = p2; pCloud[2] = p3; BoundingBox bBox = new BoundingBox(pCloud); System.out.println("bBox= " + bBox.toString()); System.out.println("Hoehe von bBox= " + bBox.getHeight()); System.out.println("Breite von bBox= " + bBox.getWidth()); System.out.println("Eckpunkt 'pointLowerLeft': " + bBox.getPointLowerLeft()); System.out.println("Eckpunkt 'pointUpperRight': " + bBox.getPointUpperRight()); } } 18.05.2004 Polymorphismus Wiederholung: Vererbung extends ("is-a") class NamedPoint extends Point { // NamedPoint-spezifische // Attribute und Methoden … } Point nPoint = new NamedPoint(1.0, 1.0, "Punkt1"); double xCoord = nPoint.getX(); 18.05.2004 Polymorphismus Wiederholung: Vererbung • Alle Klassen, die Sie schreiben, erben implizit von java.lang.Object! • … und damit alle Methoden der Klasse • Methoden u.a.: String toString() • Gibt eine Textrepräsentation des Objekts zurück Point p1 = new Point(1.0, 1.0); System.out.println(p1.toString()); Point@119c082 18.05.2004 Polymorphismus Ziel heute Begriff Polymorphismus verstehen • Bedeutung • Arten • Realisierung in Java • abstrakte Klassen • Interfaces 18.05.2004 Polymorphismus Was ist Polymorphismus ? • Bedeutung des Wortes • polymorph = vielgestaltig („mehrere Formen“) • vgl. Polymorphismus in Biologie und Chemie: • Unterschiedliche Formen von Lebewesen derselben Art • Körper oder Stoffe, die abhängig von der Umgebung (z.B. Temperatur) unterschiedliche (poly-) Formen (-morph) annehmen können (z.B. Wasser) 18.05.2004 Polymorphismus Was ist Polymorphismus ? • Bedeutung in der OOP • Eine Operation (Operator, Methode) ist für verschiedene Typen (Objektklassen) zulässig. • Jedes Objekt weiß selbst, wie es die Operation auszuführen hat. • Deklaration genereller Eigenschaften durch abstrakte Klassen und Interfaces. • Überschreibung vordeklarierter Methoden 18.05.2004 Polymorphismus Was ist Polymorphismus ? • Beispiel: Überschreiben der Methode toString() class Point { … public String toString() { return "x: "+getX()+"; y: "+getY(); } } 18.05.2004 Polymorphismus Dynamische Bindung FigureInterface FigureContainer +area() +cumulateArea() Circle +area() Rectangle +area() • Die Entscheidung für die benötigte Methode wird zur Laufzeit getroffen. Das wird als dynamische Bindung bezeichnet. 18.05.2004 Polymorphismus Was ist Polymorphismus ? • Beispiel: Überschreiben der Methode toString() class Point { … public String toString() { return "x: "+getX()+"; y: "+getY(); } } Object instanz = new Point(1.0, 2.0); System.out.println(intanz.toString()); x:1.0; y:2.0 18.05.2004 Polymorphismus Wozu Polymorphismus ? • Erweiterbarkeit • Das grundsätzliche Verhalten eines Objektes wird durch die Methoden-Deklarationen der Superklasse festgelegt: • toString(), textuelle Repräsentation eines Objekts • area(), Berechnung und Rückgabe der Flächengröße • Die Implementierung der Methode erfolgt jedoch erst in einer speziellen Klasse (= Überschreiben) - also an der Stelle, wo das Wissen über die Eigenschaften der Objekte ist. 18.05.2004 Polymorphismus Wozu Polymorphismus ? • Fördert die klare Konzeption • Verwendung einheitlicher Namen für Operationen • Es kann zunächst (abstrakt) beschrieben was zu tun ist und erst später wie es für einzelne Objekttypen (=Klassen) zu tun ist. • Der (geschickte) Einsatz des Polymorphismus erlaubt eine sehr elegante objektorientierte Entwicklung..., bedarf jedoch auch einiger Erfahrung. 18.05.2004 Polymorphismus Polymorphismus in Java • Beschreibung des abstrakten Verhaltens durch a) abstrakte Methoden b) Interfaceklassen • Die abstrakten Methoden bzw. die Methoden der Interfaceklassen müssen in den abgeleiteten Klassen überschrieben und implementiert werden. 18.05.2004 Polymorphismus Abstrakte Klassen .... abstract class AbstractClass { abstract void abstractMethod(); /* Muß überschrieben werden. */ void baseMethod() { /* Kann überschrieben werden */ }; } • Können implementierte und abstrakte (zu überschreibende) Methoden enthalten • Ableitung via extends • Keine Mehrfachvererbung möglich 18.05.2004 Polymorphismus .... und Interfaces interface AbstractClass { int useArrayList = 1; /*...usw.*/ void baseMethod(); /* Muß in der abgeleiteten Klasse überschrieben und implementiert werden. */ } • Kann als Attribute lediglich Konstanten enthalten (flags) und alle Methoden müssen überschrieben werden (Ableitung via implements) • Mehrfachvererbung von Interfaceklassen ist möglich Aber selten notwendig ! 18.05.2004 Polymorphismus Java Beispiel interface FigureInterface { public double area(); } class Rectangle implements FigureInterface{ Rectangle(double widthIn, double heightIn) { width_ = widthIn; height_ = heightIn; } public double area(){ // überschreibe area()für Rechteck: return (width_*height_); } double width_, height_; } • für Circle analog... 18.05.2004 Polymorphismus Java Beispiel FigureInterface[] figures; figures = new FigureInterface[2]; Figure testRectangle = new Rectangle(1.0,2.0); Figure testCircle = new Circle(3.0); figures[0] = testRectangle; figures[1] = testCircle double areaSum = 0; for (int i=0; i < figures.length; i++) { areaSum += figures[i].area(); } System.out.println("Cummulated area: " + areaSum ); 18.05.2004 Polymorphismus Zusammenfassung • Polymorphismus ist ein wesentliches Konzept der Objektorientierung. Es dient • der Abstraktion bei Entwurf und Implementierung • gleiche Namen für gleiches Verhalten • Trennung von Verhalten und Implementierung (= Form) • der Implementierung von Methoden an der Stelle, wo das Wissen um die Eigenschaften eines Objektes vorhanden ist. 18.05.2004 Polymorphismus Aufgabe 4 • Vorab: Implementierung des Figure Beispiels • die HA 4 via e-mail an: Jan Drewnak ([email protected]) & Arne Bröring ([email protected]) bis Samstag 29.05; 24.00 s.t. 18.05.2004 Polymorphismus