Axel Rogat
Objektorientiertes Programmieren mit C++ und JAVA
 
13.8: Überladen von new Kapitel 13 14: Stream-Klassen 
 
  13.9 Schnittstellen  
 

Beim Entwurf einer Klasse nicht für eigene Zwecke, sondern zur Verwendung durch andere Benutzer, sind einige Überlegungen zu berücksichtigen, um den Umgang mit der Klasse so einfach und sicher wie möglich zu gestalten.

13.9.1 Reguläre Funktionen

Es ist im höchsten Maße gefährlich, von der üblichen Semantik einiger Funktionen, insbesondere Operatoren, abzuweichen. Es gibt einige Funktionen, auf deren Funktionalität sich der Benutzer einer Klasse verlassen können muß.

Diese Funktionen werden oft reguläre Funktionen genannt. Sie sind hier für eine Klasse T aufgeführt:

Auf die explizite Implementation dieser Funktionen kann nur verzichtet werden, wenn die vom Compiler automatisch bereitgestellten Ersatzfunktionen die gleiche Semantik haben würden. Fast immer kann man sie nur dann weglassen, wenn kein dynamischer Speicher beteiligt ist.

Bei Klassen mit arithmetischen Eigenschaften sollte die Semantik für kombinierte Zuweisungsoperatoren wie += auch immer die sein, als würde zunächst mit dem Operator + ein temporäres Objekt erzeugt und dann mit = zugewiesen.

13.9.2 Nice Classes

Einige Funktionen sollten in einer allgemein verwendbaren Klasse auf jeden Fall definiert werden. Ihr Weglassen kann zu unerwünschten Effekten oder zu eingeschränkter Benutzbarkeit führen.

Beispielsweise kann man nur Arrays von Objekten einer Klasse anlegen, wenn ein Default-Konstruktor (ohne Parameter) definiert ist, entweder explizit oder -- falls sinnvoll -- durch die Abwesenheit jedes Konstruktors.

Viele sinnvolle Funktionen wie Tauschen, Suchen, etc. werden durch Templates implementiert, so daß sie für beliebige Klassen durchführbar sind. Für das Tauschen ist aber der primäre Zuweisungsoperator notwendige Voraussetzung, für das Suchen der Vergleichsoperator ==.

Eine Klasse, die die folgenden wichtigen Funktionen (explizit oder implizit) implentiert, wird oft " nice class" genannt:

¤ Default-Konstruktor   T::T();
¤ Copy-Konstruktor   T::(const T&);
¤ Zuweisungsoperator   T& T::operator = (const T&);
¤ Vergleichsoperator   bool T::operator == (const T&);
¤ Destruktor   T::~T();

Es ist leider nicht sinnvoll, eine minimale Sammlung von Operationen mit ihren Semantiken vorzuschreiben, die einer vernünftige Klasse auf jeden Fall bereitstellen sollte. Für fast jede Funktion läßt sich eine Klasse finden, bei der die geforderte Standard-Implementation unvernünftig wäre.

 
13.8: Überladen von new Startseite 14: Stream-Klassen 
 

© 1998 Axel Rogat