•
18.05.2004 Sitzung 5
Sommersemester 2004Jan Drewnak
Entwicklung und Einsatzvon Geosoftware I
Praktikum
Sitzung 5: Polymorphismus
18.05.2004 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
• 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?
• ist ein Rechteck; wird definiert durch zwei Punkte (links unten und rechts oben):
Point lowerLeft;Point upperRight;
18.05.2004 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)
Klassenname
Attribute
Methoden
Klasse Assoziation ("besitzt Attribut vom Typ")
18.05.2004 Polymorphismus
Musterlösung Aufgabe 3
public class BoundingBox {
//Attribute (bzw. Variable):private Point pointLowerLeft;private Point pointUpperRight;
//Constructorpublic 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);
}
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 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 nullif((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 nullif((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 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());}
}
18.05.2004 Polymorphismus
Wiederholung: Vererbung
Point nPoint = new NamedPoint(1.0, 1.0, "Punkt1");double xCoord = nPoint.getX();
class NamedPoint extends Point {
// NamedPoint-spezifische // Attribute und Methoden …}
extends ("is-a")
18.05.2004 Polymorphismus
Wiederholung: Vererbung
• Alle Klassen, die Sie schreiben, erben implizit von java.lang.Object!
• … und damit alle Methoden der Klasse
Point p1 = new Point(1.0, 1.0);System.out.println(p1.toString());
• Methoden u.a.: String toString()
• Gibt eine Textrepräsentation des Objekts zurück
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
+area()
Circle
+area()
Rectangle
+area()
FigureContainer
+cumulateArea()
• 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 Beispielinterface 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 BeispielFigureInterface[] 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.