homedukeOOP mit Java: Objektorientierte Programmierung Prof. Dr. Uwe Schmidt FH Wedel

Objektorientierte Programmierung

weiter

weiter

Mehrfachvererbung

Idee
ein Objekt kann die Eigenschaften aus mehreren Klassen beziehen

ein Objekt kann mehrere Schnittstellen besitzen

weiter
merke
Beliebtes Beispiel in der OO-Literatur:

Es gibt FleischFresser
und PflanzenFresser,
AllesFresser besitzen die Eigenschaften von beiden.

weiter
merke
Autos und
Schiffe sind Unterklassen von Fahrzeug,
AmphibienFahrzeug ist sowohl Auto als auch Schiff.
weiter
merke
MehrfachVERerbung ist eigentlich der falsche Begriff.
merke
MehrfachBEerbung beschreibt die Richtung des Erbens präzise.
in C++
Mehrfachvererbung erlaubt
weiter
Beispiel
class Point {
private:
 
  double x;
  double y;
 
public:
 
  Point(double x1double y1) {
    x = x1;
    y = y1;
  }
  double getX() const { return x}
  double getY() const { return y}
};
 
class Color {
private:
 
  int c;
 
public:
 
  Color(int c1) {
    c = c1;
  }
  int getColor() const { return c}
};
 
class ColoredPoint : public Point,
                     public Color
{
public:
      ColoredPoint(double xdouble yint c)
        : Point(x,y)
          Color(c) {
      }
};
 
 
 
void f() {
  ColoredPoint * cp =
    new ColoredPoint(1.0,2.0,255);
 
  cp->getX();     // --> 1.0
  cp->getY();     // --> 2.0
  cp->getColor()// --> 255
}
 
weiter
merke
mit Mehrfachvererbung kann eine Klasse ohne großen Aufwand aus bestehenden Klassen zusammengesetzt werden.

Die beerbende Klasse enthält alle Datenfelder und alle Methoden aus allen beerbten Klassen.

weiter
merke
Verständlichkeit?

Programmteile über viele Stellen verstreut.

weiter
merke
schwierig zu implementieren!
weiter
merke
Namenskonflikte!
?
Was geschieht, wenn mehrere Oberklassen gleiche Methoden definieren?
?
Was geschieht, wenn mehrere Oberklassen eine gemeinsame Oberklasse als Vorfahre in der Klassenhierachie besitzen?
weiter
Namenskonflikte
bei Mehrfachvererbung
 
class X {
public:
  int d;
  void foo() { ++d}
};
 
class Y1 : public X {
public:
  int d1;
  void bar() { ++d1}
};
 
class Y2 : public X {
public:
  int d2;
  void bar() { --d2}
};
 
class Z : public Y1public Y2 {
};
 
void f() {
  Z * o;
 
  o->bar()// welches bar?
  o->foo()// welches foo?
  o->d;     // welches d, wieviele d Variablen
}
weiter
?
Wann ist Mehrfachvererbung sinnvoll?
weiter

weiter

Schnittstellen mit default-Implementierungen

mehrere
Schnittstellen
eine Klasse kann mehrere Schnittstellen besitzen
weiter
merke
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
Equality
eine abstrakte Klasse für Vergleiche == und !=,
nur == muss von Unterklassen implementiert werden.
 
class Equality {
public:
 
  virtual
  int operator == (const Equality & x2) const = 0;
 
  virtual
  int operator != (const Equality & x2) const {
    return
      !( *this == x2 );
  }
};
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
Anwendung
nur zwei Methoden für == und für > müssen implementiert werden
 
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 dieses Arten von Klassen/Schnittstellen können konkrete Klassen ohne Probleme mehrfach Gebrauch machen.
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.
weiter

weiter

Schnittstellen in Java

Mehrfachvererbung
ist in Java für Klassen nicht möglich.
aber
Mehrfachvererbung mit Schnittstellen ist erlaubt.
weiter
?
Software-technischen Probleme und Konsequenzen?
Beispiel
für Gleichheitstest und Ordnung
hier der Einfachheit halber ohne Nutzung von Generics
weiter
Equality
die Schnittstelle
 
public
interface Equality {
 
  boolean isEqual(Object o2);
 
  boolean isNotEqual(Object o2);
}
weiter
Ordering
die Schnittstelle erweitert Equality
 
public
interface Ordering
  extends Equality {
 
  boolean isGreater(Object o2);
 
  boolean isGreaterOrEqual(Object o2);
 
  boolean isLessThan(Object o2);
 
  boolean isLessOrEqual(Object o2);
}
 
weiter
Anwendung
alle Methoden aus der Ordering Schnittstelle müssen neu implementiert werden.
 
public
class OrderExample
  implements Ordering {
 
  public
  boolean isEqual(Object o2) {
    // ...
  }
 
  public
  boolean isNotEqual(Object o2) {
    // ...
  }
 
  // ... die restlichen 4 Methoden
}
weiter
merke
Gefahr der Codeverdopplung
weiter
merke
In einer Schnittstelle dürfen nur Methoden deklariert werden, sie dürfen aber nicht definiert werden.
Also nur Methodenköpfe, keine Methodenrümpfe.
weiter
merke
Alle Methoden in einer Schnittstelle sind per Definition abstrakt.
weiter
merke
Alle deklarierten Größen in einer Schnittstelle sind per Definition öffentlich (public).
weiter
merke
In einer Schnittstelle dürfen Konstanten definiert und initialisiert werden.
weiter
merke
Schnittstellen dürfen andere Schnittstellen erweitern, auch mehrfach.
weiter
Beispiel mit Generics
weiter
vollständiges Beispiel für Ordnungsfunktionen als Schnittstelle und abstrakte Klasse
weiter
vollständiges Beispiel für Schnittstellen und/oder abstrakte Klassen
weiter
Eine Schnittstelle für totale Ordnungen ist in Java ab 1.5 mit Hilfe von Generics definiert.
 
public
interface Comparable<T> {
  int compareTo(T o);
}
schlecht
Für Gleichheitstest gibt es dieses leider nicht (Abwärtskompatibilität).
merke
Gleichheitstest in Java mit equals aus Object

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