Declarar uma referência de interface
Você pode utilizar interfaces como um tipo de referência para declarar uma variável de referência. Como você aprendeu anteriormente, é possível utilizar variáveis de referência para criar e gerenciar as instâncias de uma classe. Uma vez que não é possível instanciar uma interface, você pode estar se perguntando quais tipos de objetos pode gerenciar utilizando uma referência de interface.
As referências de interface podem conter referências a instâncias de qualquer classe que implemente a interface da mesma forma que uma variável de referência com o tipo de uma classe superior pode conter referências a instâncias de qualquer subclasse. (Se você imaginar agora que a classe superior é abstrata, você tem uma situação idêntica de um tipo que não pode ser instanciado mantendo referências a instâncias de outras classes relacionadas a ela).

Ao utilizar uma variável com o tipo de uma classe superior para gerenciar uma instância de uma de suas subclasses, você só poderá acessar os componentes que estiverem definidos na classe superior. De modo semelhante, quando você utiliza uma referência de interface para administrar uma instância de uma classe que implementa a interface, você só pode acessar os componentes definidos na interface. Isso significa que o desenvolvedor de uma determinada estrutura de classes pode enviar interfaces que fornecem uma visão particular de uma classe em vez de expor cada coisa que a classe pode fazer.
Você pode chamar um método de uma interface utilizando uma variável de referência com o tipo da classe. Neste caso, você deve utilizar o nome completo do método (incluindo o nome da interface). Se você tiver definido um alias para o método, pode utilizá-lo. Ao chamar um método de interface utilizando uma referência de interface, o nome da interface será derivado do tipo da variável de referência, e você não precisará especificar o nome da interface antes do nome do método.
Casting com referências de interface
A atribuição de referências a objetos a uma referência de interface também é um cast. Você analisará o objeto de aluguel ou de companhia aérea como se fosse um parceiro de negócios. É sempre possível atribuir uma instância da classe de implementação para uma referência de interface. Este é um up-cast, e é garantido pelo fato de que a classe implementa a interface. Todavia, você não pode atribuir um objeto de uma referência de interface a uma referência com o tipo de uma classe de implementação, uma vez que a verificação de sintaxe não pode ver se os objetos de tempo de execução em si serão compatíveis. A atribuição rental = partner funcionaria se o objeto na referência de interface realmente for uma instância de lcl_car_rental, mas se for uma instância de outra classe de implementação, você causaria um erro em tempo de execução.

Aqui temos um down-cast da mesma forma que o detectado na herança. A solução aqui é a mesma. Se você precisar atribuir uma referência a objetos de uma variável de referência com o tipo de uma interface a uma com o tipo de uma classe (para que você possa acessar funcionalidades específicas da classe), deve usar o operador CAST. A solução correta neste caso seria:
123 IF partner IS INSTANCE OF lcl_car_rental.
rental = CAST #( partner ).
ENDIF.