homedukeOOP mit Java: Schnittstellen und Mehrfachvererbung Prof. Dr. Uwe Schmidt FH Wedel

Schnittstellen und Mehrfachvererbung

weiter

weiter

Schnittstellen mit Default-Implementierungen

mehrere
Schnittstellen
eine Klasse kann mehrere Schnittstellen besitzen
weiter
Entwurfsregel
Wenige Schnittstellen einheitlich in einem System definieren und diese Schnittstellen an vielen Stellen verwenden!
gut
Verständlichkeit wird erhöht.
weiter
Beispiel
eine gemeinsame Schnittstelle für Vergleichsoperationen
==, !=, >, >=, <, <=.
 
Diese Schnittstelle in jeder Klasse, auf der eine totale Ordnung definiert werden soll, verwenden.
weiter
gut
Verbesserung:
Diese Schnittstelle für Vergleiche aufteilen in zwei Schnittstellen, einmal für == und !=, und einmal für die restlichen 4 Operationen.
?
Warum sinnvoll?
Equality
eine abstrakte Klasse für Vergleiche == und !=.
 
class Equality {
public:
 
  virtual
  int operator == (const Equality & x2) const = 0;
 
  virtual
  int operator != (const Equality & x2) const {
    return
      !( *this == x2 );
  }
};
weiter
gut
Nur noch die Methode für == muss in einer konkreten Klasse implementiert werden.
gut
Default-Implementierung stellt die Beziehnung zwischen == und != sicher.
weiter
Ordering
eine abstrakte Klasse für Vergleiche >, >=, <, <=, nur > muss von Unterklassen implementiert werden, die anderen Operationen werden auf > und == zurueckgeführt
 
class Ordering : public Equality {
public:
 
  virtual
  int operator >  (const Ordering & x2) const = 0;
 
  virtual
  int operator >= (const Ordering & x2) const {
    return
      ( *this > x2 )
      ||
      ( *this == x2 );
  }
 
  virtual
  int operator <= (const Ordering & x2) const {
    return
      ( x2 >= *this );
  }
 
  virtual
  int operator <  (const Ordering & x2) const {
    return
      ( x2 > *this );
  }
 
};
weiter
gut
Nur noch die Methode für > muss in einer konkreten Klasse implementiert werden.
gut
Default-Implementierungen stellen die Beziehnungen zwischen den Operationen sicher.
weiter
 
class Str : public Ordering {
  char * s;
 
public:
 
  // ...
 
  int operator == (const Equality & x2) const
  {
    // downcast mit Laufzeitcheck
    Str & s2 = dynamic_cast<Str &>(x2);
    return strcmp(ss2.s) == 0;
  }
 
  int operator > (const Ordering & x2) const
  {
    return strcmp(s((Str &)x2).s) > 0;
  }
};
weiter
gut
Von dieser Art von Klassen/Schnittstellen können konkrete Klassen ohne Probleme mehrfach erben.
gut
Mehrfachvererbung ist hier ohne Probleme bezüglich Mehrdeutigkeiten, Verständlichkeit und Implementierung sinnvoll einsetzbar.
weiter
gut
Die Schnittstellen-Klassen besitzen keine Datenfelder
Keine Probleme mit Datenfeldern bei Mehrfachvererbung
weiter
merke
Die Schnittstellen-Klassen sind abstrakte Klassen, einige Methoden sind nicht implementiert.
Keine Exemplare von diesen Klassen erzeugbar.

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