Declarar una referencia de interfaz
Puede utilizar interfaces como un tipo de referencia para declarar una variable de referencia. Como que se ha indicado previamente, utilice las variables de referencia para crear y gestionar las instancias de una clase. Como no es posible instanciar una interfaz, es posible que desee saber qué clases de objetos puede gestionar mediante una referencia de interfaz.
Las referencias de interfaz pueden contener referencias a instancias de cualquier clase que implemente la interfaz de la misma manera que una variable de referencia con el tipo de una clase superior puede contener referencias a instancias de cualquier subclase. (Si ahora imagina que la clase superior es abstracta, tiene una situación idéntica de un tipo que no se puede instanciar manteniendo referencias a instancias de otras clases que están relacionadas con ella).

Al utilizar una variable con el tipo de una clase superior para gestionar una instancia de una de sus subclases, solo puede acceder a los componentes definidos en la clase superior. De forma similar, cuando utiliza una referencia de interfaz para gestionar una instancia de una clase que implementa la interfaz, solo puede acceder a los componentes definidos en la interfaz. Esto significa que el desarrollador de un framework concreto de clases puede enviar interfaces que proporcionan una vista particular de una clase en lugar de exponer cada cosa que puede hacer la clase.
Puede llamar a un método desde una interfaz utlizando una variable de referencia con el tipo de la clase. En este caso, debe utilizar el nombre completo del método (incluido el nombre de interfaz). Si ha definido un alias para el método, puede utilizarlo. Al llamar a un método de interfaz mediante una referencia de interfaz, el nombre de la interfaz se deduce del tipo de la variable de referencia y no es necesario especificar el nombre de interfaz antes del nombre del método.
Casting con referencias de interfaz
La asignación de referencias de objeto a una referencia de interfaz es también un cast; considera el objeto de alquiler o de transportista como si fuera una interlocutor comercial. Siempre puede asignar una instancia de la clase de implementación a una referencia de interfaz. Esto es un upcast, y está garantizado por el hecho de que una clase implementa la interfaz. Sin embargo, no puede asignar un objeto de una referencia de interfaz a una referencia con el tipo de clase de implementación, puesto que la verificación de sintaxis no puede determinar si los objetos de tiempo de ejecución reales serán compatibles. La asignación rental = partner funcionaría si el objeto en la referencia de interfaz es realmente una instancia de lcl_car_rent, pero si se trata de una instancia de otra clase de implementación, provocaría un error de tiempo de ejecución.

Aquí tenemos un downcast de la misma manera en que se ha producido en la herencia. La solución aquí es la misma. Si necesita asignar una referencia de objeto de una variable de referencia con el tipo de una interfaz a una con el tipo de una clase (para poder acceder a características específicas de la clase), debe utilizar el operador CAST. La solución correcta en este caso sería:
123 IF partner IS INSTANCE OF lcl_car_rental.
rental = CAST #( partner ).
ENDIF.