280 likes | 441 Views
Sitzung 5: Polymorphismus. 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
E N D
Sitzung 5: Polymorphismus 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 Polymorphismus
Musterlösung Aufgabe 3 - Entwurf • Wie soll die Klasse heißen? • Was repräsentiert sie? Eine BoundingBox! • Was steht in der Aufgabe? BoundingBox! • Welche Attribute hat eine BoundingBox? • 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: … 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() Polymorphismus
Assoziation ("besitzt Attribut vom Typ") Klasse Musterlösung Aufgabe 3 - Entwurf • Darstellung des Entwurfs in der Unified Modeling Language (UML) Klassenname Attribute Methoden Polymorphismus
public class BoundingBox { //Attribute (bzw. Variable): private Point pointLowerLeft; private Point pointUpperRight; //Constructor public BoundingBox(Point[] pointCloud){ double llx = pointCloud[0].getX(); double lly = pointCloud[0].getY(); double urx = pointCloud[0].getX(); double ury = 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); } Musterlösung Aufgabe 3 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 + ")"; } Polymorphismus
Musterlösung Aufgabe 3 /** * liefert die Hoehe der BoundingBox. * 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 Polymorphismus
Musterlösung Aufgabe 3 class BoundingBoxApplication{ public static void main(String[] args) { Point p1 = new Point(1.0, 2.0); Point p2 = new Point(4.0, 6.0); Point p3 = new 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()); } } Polymorphismus
extends ("is-a") Wiederholung: Vererbung class NamedPoint extends Point { // NamedPoint-spezifische // Attribute und Methoden … } Point nPoint = new NamedPoint(1.0, 1.0, "Punkt1"); double xCoord = nPoint.getX(); Polymorphismus
Point@119c082 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()); Polymorphismus
Ziel heute Begriff Polymorphismus verstehen • Bedeutung • Arten • Realisierung in Java • abstrakte Klassen • Interfaces 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) 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 Polymorphismus
Was ist Polymorphismus ? • Beispiel: Überschreiben der Methode toString() class Point { … public String toString() { return "x: "+getX()+"; y: "+getY(); } } Polymorphismus
Dynamische Bindung • Die Entscheidung für die benötigte Methode wird zur Laufzeit getroffen. Das wird als dynamische Bindung bezeichnet. Polymorphismus
x:1.0; y:2.0 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()); 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. 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. 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. Polymorphismus
Abstrakte Klassen .... abstractclass AbstractClass {abstractvoid 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 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 ! 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... 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] = testCircledouble areaSum = 0;for (int i=0; i < figures.length; i++) { areaSum += figures[i].area();}System.out.println("Cummulated area: " + areaSum ); 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. Polymorphismus
Aufgabe 4 • Vorab: Implementierung des Figure Beispiels • die HA 4 via e-mail an: Jan Drewnak (drewnak@uni-muenster.de)& Arne Bröring (arneb@uni-muenster.de)bis Samstag 29.05; 24.00 s.t. Polymorphismus