Sitzung 5

Werbung
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
Herunterladen