OOP mit Java: Summendatentypen und Gleichheitstest |
Die Default-Implementierung in public boolean equals(Object o2) {
return
this == o2;
}
Diese Implementierung ist im allgemeinen Fall nicht zu gebrauchen. Also muss diese Methode in den konkreten Klassen problemspezifisch sinnvoll reimplementiert werden. Beispiel:
abstract
public
class Shape /* extends Object */ {
...
}
Eine Klasse für Quadrate
class Square extends Shape {
private
double size;
public
Square(double size) {
this.size = size;
}
public
boolean equals(Object o) {
return
( o instanceof Square )
&& ( size == ((Square)o).size );
}
...
}
Eine Klasse für Rechtecke
class Rectangle extends Shape {
private
double w,h;
public
Rectangle(double w, double h) {
this.w = w;
this.h = h;
}
public
boolean equals(Object o) {
return
( o instanceof Rectangle )
&& ( w == ((Rectangle)o).w )
&& ( h == ((Rectangle)o).h );
}
...
}
Eine Anwendung Shape s1 = new Square(5.0);
Shape s2 = new Rectangle(5.0,5.0);
s1.equals(s2) // --> false
s2.equals(s1) // --> false
|
Aufteilung der Shape Objekte nicht disjunkt.
|
|
Für ein geometrisches Objekt aus der Realität gibt es verschiedene Klassen, mit denen
das Objekt im Modell dargestellt werden kann.
|
|
Warum erbt Square nicht von Rectangle?
Jedes Quadrat ist doch auch ein Rechteck. |
Entwurfsmuster: Fabrikmethoden, virtuelle Konstruktoren Einfachster Ansatz: Zusammenfassung der Konstruktoraufrufe in einer statischen erzeugenden Methode abstract
public
class Shape {
public
static
Shape createRectangle(double w, double h) {
return
( w == h )
? new Square(w)
: new Rectangle(w,h)
}
public
static
Shape createSquare(double w) {
return
createRectangle(w, w);
}
// ...
}
Anwendung: Shape s1 = Shape.createSquare(5.0);
Shape s2 = Shape.createRectangle(5.0,5.0);
s1.equals(s2) // --> true
s2.equals(s1) // --> true
|
Gut:
Durch virtuelle Funktionen werden in einer Anwendung die konkreten Ausprägungen von Objekten versteckt. |
|
Verarbeitung nur über Referenz-Variablen vom Typ der
abstrakten Klasse.
|
|
Problem:
Erzeugung von Objekten durch Konstruktoraufrufe von konkreten Klassen. |
|
Konstruktoraufrufe über das gesamte Programm verstreut.
|
|
Fabrikmethoden bündeln die Konstruktoraufrufe an einer Stelle.
|
|
Fabrikmethoden sorgen dafür, dass logisch gleichartige Objekte auch durch
gleichartige Objekte im Programm repräsentiert werden.
|
|
Einfachste und am häufigsten verwendete Technik zum Bündeln von Konstruktoraufrufen:
Statische erzeugende Methoden (Funktionen) |
|
Einfaches Beispiel: Arithmetische Ausdrücke
|
|
vollständige Beispiele
für ist-ein Beziehungen
|
Letzte Änderung: 14.02.2012 | © Prof. Dr. Uwe Schmidt |