ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Deklarationen →  Deklarationsanweisungen →  Klassen und Interfaces →  ABAP Objects - Übersicht → 

Friends - Freundschaft zwischen Klassen

Normalerweise gibt es für Klassen eine strikte Trennung zwischen außen (PUBLIC) und innen (PROTECTED bzw. PRIVATE). Ein Verwender darf nur auf die öffentlichen Komponenten einer Klasse zugreifen. Dies erlaubt es, die innere Implementierung einer Klasse zu ändern, ohne ihre Verwender zu invalidieren.

In seltenen Fällen müssen Klassen aber so eng zusammenarbeiten, dass sie Zugriff auf ihre gegenseitigen unsichtbaren Komponenten benötigen. Damit diese Komponenten nicht gleichzeitig allen Verwendern offen gelegt werden müssen, gibt es das Konzept der Freundschaft zwischen Klassen.

Freunde

Eine Klasse kann anderen Klassen und Interfaces (und damit allen Klassen, die das Interface implementieren) Freundschaft gewähren. Hierfür dienen die FRIENDS-Zusätze der Anweisung CLASS ... DEFINITION, in dem alle Klassen und Interfaces aufgezählt werden, denen Freundschaft gewährt werden soll. Diese Freunde erhalten Zugriff auf alle Komponenten der Freundschaft gewährenden Klasse unabhängig von deren Sichtbarkeitsbereich oder dem Zusatz READ-ONLY und können unabhängig vom Zusatz CREATE der Anweisung CLASS immer Instanzen dieser Klasse erzeugen.

Hinweis

Vorsicht ist geboten wenn einem globalen Interface Freundschaft gewährt wird. Jede Klasse, die das Interface implementiert wird zum Freund der Freundschaft gewährenden Klasse. Um diesen Kreis einzuschränken sollte die Verwendung des globalen Interfaces durch Mittel wie das Paketkonzept eingeschränkt werden.

Freundschaft ist einseitig

Das Gewähren von Freundschaft ist prinzipiell einseitig: Eine Freundschaft gewährende Klasse ist nicht automatisch auch Freund ihrer Freunde. Falls die Freundschaft gewährende Klasse auf die nicht-öffentlichen Komponenten eines Freunds zugreifen will, muss dieser ihr ebenfalls explizit Freundschaft gewähren.

Freundschaft bei Vererbung und Interfaces

Erben von Freunden und Interfaces, die einen Freund als Komponenten-Interface enthalten, werden ebenfalls zu Freunden. Deshalb ist beim Anbieten von Freundschaft äußerste Vorsicht geboten. Je höher ein Freund im Vererbungsbaum sitzt, desto mehr Unterklassen erhalten Zugriff auf alle Komponenten der Freundschaft anbietenden Klasse. Eine Klasse, die der Wurzelklasse object die Freundschaft anbietet, erhält alle Klassen von ABAP Objects zum Freund und verzichtet damit vollständig auf ihre Privatsphäre! Relativ sicher ist es dagegen, einer finalen Klasse die Freundschaft anzubieten, da nur dadurch genau diese Klasse als Freund spezifiziert werden kann.

Das Gewähren von Freundschaft wird im Gegensatz zur Eigenschaft ein Freund zu sein aber nicht vererbt. Ein Freund einer Oberklasse ist demnach nicht automatisch auch Freund ihrer Unterklassen

Die FRIENDS-Zusätze

Die Anweisung CLASS ... DEFINITION hat drei verschiedene FRIENDS-Zusätze:

Ausführbares Beispiel

Freundschaft