インタフェース参照の宣言
参照変数を宣言するための参照タイプとしてインタフェースを使用することができます。以前に学習したとおり、クラスのインスタンスを生成/管理するには、参照変数を使用します。インタフェースはインスタンス化できないため、インタフェース参照を使用して、どのようなタイプのオブジェクトを管理できるのかについて疑問に思うかもしれません。
インタフェース参照には、スーパークラスのデータ型を持つ参照変数に任意のサブクラスのインスタンスへの参照を含めることができるのと同様に、インタフェースを実装するクラスのインスタンスへの参照を含めることができます。(スーパークラスが抽象的であると想定すると、スーパークラスに関連する他のクラスのインスタンスへの参照をインスタンス化できないデータ型と同じ状況になります)。

スーパークラスの 1 つのサブクラスのインスタンスを管理するためにスーパークラス型の変数を使用するときには、スーパークラスで定義されたコンポーネントのみにアクセスすることができます。同様に、インタフェースを実装するクラスのインスタンスを管理するためにインタフェース参照を使用するときには、インタフェースで定義されたコンポーネントのみにアクセスすることができます。つまり、クラスの特定のフレームワークの開発者は、クラスが実行できるすべての単一処理を公開するのではなく、クラスの特定のビューを提供するインタフェースを出荷することができます。
クラス型の参照変数を使用して、インタフェースからメソッドを呼び出すことができます。この場合、メソッドの完全修飾名 (インタフェース名を含む) を使用する必要があります。メソッドのエイリアスを定義している場合は、それを使用することができます。インタフェース参照を使用してインタフェースメソッドを呼び出すときには、インタフェース名が参照変数の型から推測されるため、メソッド名の前にインタフェース名を指定する必要がありません。
インタフェース参照によるキャスト
オブジェクト参照をインタフェース参照に割り当てることは "キャスト" とも呼ばれます。たとえば、航空会社 (carrier) オブジェクトやレンタカー会社 (rental) オブジェクトを取引先であるかのようにみなします。実装クラスのインスタンスを常にインタフェース参照に割り当てることができます。これは "アップキャスト" と呼ばれ、クラスがインタフェースを実装するという事実によって裏付けされます。ただし、構文チェックでは、実際の実行時オブジェクトに互換性があるかどうかを判別できないため、インタフェース参照から実装クラス型の参照にオブジェクトを割り当てることはできません。割当 rental = partner は、インタフェース参照のオブジェクトが実際に lcl_car_rental のインスタンスである場合に機能しますが、別の実装クラスのインスタンスである場合は、実行時エラーが発生します。

継承の場合と同じ方法で "ダウンキャスト" を実行できます。ここでの解決方法は同じです。インタフェース型の参照変数からクラスのタイプのオブジェクト参照にオブジェクト参照を割り当てる必要がある場合は (クラスの特定の機能にアクセスできるように)、CAST 演算子を使用する必要があります。このケースの正しい解決法は次のようになります。
123 IF partner IS INSTANCE OF lcl_car_rental.
rental = CAST #( partner ).
ENDIF.