Interface-Referenz deklarieren
Sie können Interfaces als Referenztyp verwenden, um eine Referenzvariable zu deklarieren. Wie Sie bereits wissen, können Sie mit Referenzvariablen Instanzen einer Klasse anlegen und verwalten. Da ein Interface nicht instanziiert werden kann, fragen Sie sich vielleicht, welche Arten von Objekten Sie mit einer Interface-Referenz verwalten können.
Interfacereferenzen können Referenzen auf Instanzen beliebiger Klassen enthalten, die das Interface implementieren, so wie eine Referenzvariable vom Typ einer Oberklasse Referenzen auf Instanzen beliebiger Unterklassen enthalten kann. (Wenn Sie sich nun vorstellen, dass die Oberklasse abstrakt ist, haben Sie eine identische Situation eines Typs, der nicht instanziiert werden kann und Referenzen auf Instanzen anderer Klassen enthält, die sich darauf beziehen.)

Wenn Sie eine Variable vom Typ einer Oberklasse verwenden, um eine Instanz einer der dazugehörigen Unterklassen zu verwalten, können Sie nur auf die Komponenten zugreifen, die in der Oberklasse definiert sind. Analog dazu: Wenn Sie eine Interface-Referenz verwenden, um eine Instanz einer Klasse zu instanziieren, die das Interface implementiert, können Sie nur auf die Komponenten zugreifen, die im Interface definiert sind. Das bedeutet, dass der Entwickler eines bestimmten Frameworks von Klassen Interfaces ausliefern kann, die eine bestimmte Sicht auf eine Klasse bereitstellen, anstatt jedes einzelne Ding zu exponieren, das die Klasse tun kann.
Sie können eine Interface-Methode aufrufen, indem Sie eine Referenzvariable vom Typ der Klasse verwenden. In diesem Fall müssen Sie den vollqualifizierten Namen der Methode (einschließlich des Interface-Namens) verwenden. Wenn Sie einen Alias für die Methode definiert haben, können Sie diesen verwenden. Wenn Sie eine Interface-Methode über eine Interface-Referenz aufrufen, wird der Interface-Name vom Typ der Referenzvariable abgeleitet. Sie müssen Sie den Interface-Namen nicht vor dem Methodennamen angeben.
Casting bei Interface-Referenzen
Die Zuweisung von Objektreferenzen zu einer Interface-Reference ist ebenfalls ein Cast. Das Miet- oder Fluggesellschaft-Objekt wird als Geschäftspartner gesehen. Sie können einer Interface-Referenz jederzeit eine Instanz der implementierenden Klasse zuweisen. Dies ist ein Up Cast und er wird dadurch gesichert, dass die Klasse das Interface implementiert. Sie können aber kein Objekt aus einer Interface-Referenz zu einer Referenz mit dem Typ einer implementierenden Klasse zuweisen, da die Syntaxprüfung nicht weiß, ob die tatsächlichen Laufzeitobjekte kompatibel sind. Die Zuordnung rental = partner würde funktionieren, wenn das Objekt in der Interface-Referenz tatsächlich eine Instanz von lcl_car_hire ist, aber wenn es sich um eine Instanz einer anderen implementierenden Klasse handelt, würden Sie einen Laufzeitfehler verursachen.

Hier liegt ein Down Cast vor, genau wie bei der Vererbung. Die Lösung ist hier die gleiche. Wenn Sie eine Objektreferenz aus einer Referenzvariablen vom Typ eines Interfaces einer Objektreferenz vom Typ einer Klasse zuweisen müssen (um auf bestimmte Merkmale der Klasse zugreifen zu können), müssen Sie den CAST-Operator verwenden. Die richtige Lösung wäre in diesem Fall:
123 IF partner IS INSTANCE OF lcl_car_rental.
rental = CAST #( partner ).
ENDIF.