Déclaration d'une référence d'interface
Vous pouvez utiliser des interfaces comme type de référence pour déclarer une variable de référence. Comme vous l'avez appris précédemment, vous utilisez des variables de référence pour créer et gérer les instances d'une classe. Comme il n'est pas possible d'instancier une interface, vous vous demandez peut-être quels types d'objets vous pouvez gérer à l'aide d'une référence d'interface.
Les références d'interface peuvent contenir des références à des instances de n'importe quelle classe qui implémente l'interface de la même manière qu'une variable de référence du type d'une surclasse peut contenir des références à des instances de n'importe quelle sous-classe. (Si vous imaginez maintenant que la surclasse est abstraite, vous avez une situation identique d'un type qui ne peut pas être instancié contenant des références à des instances d'autres classes qui lui sont liées).

Lorsque vous utilisez une variable avec le type d'une surclasse pour gérer une instance de l'une de ses sous-classes, vous pouvez uniquement accéder aux membres qui sont définis dans la surclasse. De la même manière, lorsque vous utilisez une référence d'interface pour gérer une instance d'une classe qui implémente l'interface, vous ne pouvez accéder qu'aux composants définis dans l'interface. Cela signifie que le développeur d'une structure particulière de classes peut expédier des interfaces qui fournissent une vue particulière d'une classe au lieu d'exposer chaque chose que la classe peut faire.
Vous pouvez appeler une méthode à partir d'une interface à l'aide d'une variable de référence avec le type de la classe. Dans ce cas, vous devez utiliser le nom complet de la méthode (y compris le nom de l'interface). Si vous avez défini un alias pour la méthode, vous pouvez l'utiliser. Lorsque vous appelez une méthode d'interface à l'aide d'une référence d'interface, le nom de l'interface est déduit du type de la variable de référence et vous n'avez pas besoin d'indiquer le nom de l'interface avant le nom de la méthode.
Casting avec références d'interface
L'affectation de références d'objet à une référence d'interface est également un transtypage ; vous examinez l'objet loué ou porteur comme s'il s'agissait d'un partenaire. Vous pouvez toujours affecter une instance de la classe d'implémentation à une référence d'interface. Il s'agit d'un transtypage ascendant, garanti par le fait que la classe implémente l'interface. Cependant, vous ne pouvez pas affecter un objet d'une référence d'interface à une référence du type d'une classe d'implémentation car le contrôle syntaxique ne peut pas déterminer si les objets d'exécution réels seront compatibles. L'affectation rental = partner fonctionnerait si l'objet dans la référence d'interface est réellement une instance de lcl_car_rent, mais s'il s'agit d'une instance d'une autre classe d'implémentation, vous provoquez une erreur d'exécution.

Ici, nous avons un down-cast de la même manière que nous l'avons rencontré dans l'héritage. La solution ici est la même. Si vous devez affecter une référence objet d'une variable de référence avec le type d'une interface à une référence avec le type d'une classe (afin de pouvoir accéder à des caractéristiques spécifiques de la classe), vous devez utiliser l'opérateur CAST. Dans ce cas, la solution correcte serait :
123 IF partner IS INSTANCE OF lcl_car_rental.
rental = CAST #( partner ).
ENDIF.