homedukeOOP mit Java: Summendatentypen und Gleichheitstest Prof. Dr. Uwe Schmidt FH Wedel

Summendatentypen und Gleichheitstest

weiter

weiter

Ist-ein-Beziehungen und Gleichheitstest

Object definiert Gleichheitstest.

Die Default-Implementierung in Object vergleicht die Referenzen auf Gleichheit.

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 wdouble 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
weiter
merke
Aufteilung der Shape Objekte nicht disjunkt.
merke
Für ein geometrisches Objekt aus der Realität gibt es verschiedene Klassen, mit denen das Objekt im Modell dargestellt werden kann.
merke
Warum erbt Square nicht von Rectangle?
Jedes Quadrat ist doch auch ein Rechteck.
weiter

weiter

Lösung

Entwurfsmuster: Fabrikmethoden, virtuelle Konstruktoren

Einfachster Ansatz: Zusammenfassung der Konstruktoraufrufe in einer statischen erzeugenden Methode

abstract
public
class Shape {
 
  public
  static
  Shape createRectangle(double wdouble h) {
    return
      ( w == h )
      ? new Square(w)
      : new Rectangle(w,h)
  }
 
  public
  static
  Shape createSquare(double w) {
    return
      createRectangle(ww);
  }
 
  // ...
}

Anwendung:

Shape s1 = Shape.createSquare(5.0);
Shape s2 = Shape.createRectangle(5.0,5.0);
 
s1.equals(s2)  // --> true
s2.equals(s1)  // --> true
weiter
merke
Gut:
Durch virtuelle Funktionen werden in einer Anwendung die konkreten Ausprägungen von Objekten versteckt.
merke
Verarbeitung nur über Referenz-Variablen vom Typ der abstrakten Klasse.
merke
Problem:
Erzeugung von Objekten durch Konstruktoraufrufe von konkreten Klassen.
merke
Konstruktoraufrufe über das gesamte Programm verstreut.
merke
Fabrikmethoden bündeln die Konstruktoraufrufe an einer Stelle.
merke
Fabrikmethoden sorgen dafür, dass logisch gleichartige Objekte auch durch gleichartige Objekte im Programm repräsentiert werden.
merke
Einfachste und am häufigsten verwendete Technik zum Bündeln von Konstruktoraufrufen:
Statische erzeugende Methoden (Funktionen)
merke
Einfaches Beispiel: Arithmetische Ausdrücke
merke

Letzte Änderung: 14.02.2012
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel