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