✒️ABAP POO - Las Interfaces

ABAP POO Las Interfaces

INTERFACES

Las clases, sus instancias (los objetos) y el acceso a los objetos usando variables referenciadas son la base de la programación orientada a objetos en ABAP. Además, hay veces en las que es necesario para clases similares proporcionar funcionalidades similares pero que están codificadas diferentes en cada clase, las cuales dan un punto de contacto común con el usuario. Por ejemplo, podríamos tener dos clases similares, cuenta corriente y cuenta de ahorro, las cuales tienen un método para calcular las comisiones del año. Las interfaces y nombres de los métodos son los mismos pero la implementación es diferente. El usuario de las clases y las instancias tiene que ser capaz de ejecutar el método para todas las cuentas sin preocuparse del tipo de cada cuenta individual. ABAP Objects hace posible esto mediante el uso de las interfaces. Las interfaces son estructuras independientes que se pueden implementar en una clase para extender el ámbito de esa clase. El ámbito específico de una clase viene definido por sus componentes y sus secciones de visibilidad. Por ejemplo, los componentes públicos de una clase definen su ámbito público, ya que todos sus atributos y los parámetros de los métodos pueden ser utilizados por todos los usuarios. Los componentes protegidos de una clase definen su ámbito en lo que se refiere a sus subclases. Las interfaces extienden el ámbito de una clase añadiendo sus propios componentes a la sección pública. Esto permite a los usuarios acceder a diferentes clases por medio de un punto de contacto común. Las interfaces junto con la herencia proporcionan uno de los pilares básicos del polimorfismo, ya que permiten que un sólo método con una interface se comporte distinto en diferentes clases.

Definición de interfaces

Al igual que las clases, las interfaces se pueden definir o bien globalmente en el R/3 Repository o localmente en un programa ABAP.

La definición de una interface local es el código existente entre las sentencias:

INTERFACE <intf>.

ENDINTERFACE.

La definición contiene la declaración de todos los componentes (atributos, métodos, eventos) de la interface. Se pueden definir los mismos componentes en una interface que en una clase. Los componentes de las interfaces no tienen que ser asignados a ninguna sección de visibilidad ya que automáticamente pertenecen a la sección pública de la clase en la que la interface es implementada. Las interfaces no tienen una parte de implementación ya que sus métodos son implementados en la clase que implementa la interface.

Implementación de interfaces

A diferencia de las clases, las interfaces no tienen instancias, en vez de eso, las interfaces son implementadas por las clases. Para implementar una interface en una clase se usa la sentencia INTERFACES <intf>. en la parte declarativa de la clase. Esta sentencia sólo puede aparecer en la sección pública de la clase. Cuando se implementa una interface en una clase, los componentes de la interface se añaden al resto de componentes de la sección pública. Un componente <icomp> de una interface <intf> puede ser direccionado como si fuese un miembro de la clase bajo el nombre <intf~icomp>. La clase tiene que implementar los métodos de todas las interfaces implementadas en ella. La parte de implementación de la clase debe contener la implementación de cada método de la interface <imeth>:

METHOD <intf~imeth>.

ENDMETHOD.

Las interfaces pueden ser implementadas por diferentes clases. Cada una de las clases es ampliada con el mismo conjunto de componentes, aunque los métodos de la interface pueden ser implementados de manera distinta en cada clase. Las interfaces permiten usar diferentes clases de una manera uniforme aprovechando las referencias a las interfaces (polimorfismo). Por ejemplo, las interfaces implementadas en diferentes clases amplían el ámbito público de cada clase en el mismo conjunto de componentes. Si la clase no tiene ningún componente público específico de ella misma entonces la interface describe completamente el ámbito público de la clase.

Referencias a interfaces

Las variables referenciadas permitan acceder a los objetos. En lugar de crear variables referenciadas con referencia a una clase, se pueden crear con referencia a una interface. Este tipo de variables referenciadas puede contener referencias a los objetos de las clases que implementen esa interface.

Para definir una referencia a una interface se usa la adición TYPE REF TO <intf> en las sentencias

DATA o TYPES. <intf> tiene que ser una interface que haya sido declarada en el programa antes de que esta declaración tenga lugar. Una variable referenciada con el tipo referenciado a una interface se llama variable referenciada a una interface, o referencia a interface simplemente. Una referencia a interface <iref> permite al usuario usar <iref>-><icomp> para acceder a todos los componentes visibles de la interface <icomp> del objeto al cual la referencia está apuntando. Esto permite al usuario acceder a todos los componentes del objeto que fueron añadidos a su definición al implementar la interface.

Direccionar objetos usando referencias a interfaces

Para crear un objeto de la clase <class> primero se tiene que haber declarado una variable referenciada <cref> con referencia a la clase. Si la clase <class> implementa una interface <intf>, se puede usar la siguiente asignación entre la variable referenciada a la clase <cref> y una referencia a interface <iref> para hacer que la referencia a interface <iref> apunte al mismo objeto que la referencia a clase en <cref>: <iref> = <cref>.

Si la interface <intf> contiene un atributo dependiente de instancia <attr> y un método dependiente de instancia <meth> se puede direccionar los componentes de la interface como sigue:

Usando la variable referenciada a una clase <cref>:

− Para acceder a un atributo <attr>: <cref>-><intf~attr>

− Para acceder al método <meth>: CALL METHOD <cref>-><intf~meth>

Usando la variable referenciada a una interface <iref>:

− Para acceder a un atributo <attr>: <iref>-><attr>

− Para acceder al método <meth>: CALL METHOD <iref>-><meth>

Siempre que los componentes estáticos de las interfaces estén implicados sólo se puede usar el nombre de la interface para acceder a las constantes:

Para acceder a una constante <const>: < intf>=><const>

Para todos los demás componentes estáticos de una interface, sólo se pueden usar referencias a objetos o la clase que implementa la interface:

Para acceder a un atributo estático <attr>: <class>=><intf~attr>

Para llamar a un método estático <meth>: CALL METHOD <class>=><intf~meth>

Asignación usando referencias a interfaces

Al igual que las referencias a clases, se pueden asignar referencias a interfaces a diferentes variables referenciadas. También se pueden realizar las asignaciones entre variables referenciadas a clases y a interfaces. Cuando se usa la sentencia MOVE o el operador de asignación (=) para asignar variables referenciadas, el sistema debe ser capaz de reconocer en la comprobación de la sintaxis si la asignación es posible. Supongamos que tenemos una referencia a clase <cref> y tres referencias a interfaces <iref>, <iref1> y <iref2>. Las siguientes asignaciones con referencias a interfaces pueden ser comprobadas estáticamente:

− <iref1> = <iref2>. Ambas referencias a interfaces deben referirse a la misma interface o la interface de <iref1> tiene que tener a la interface <cref2> como componente.

− <iref> = <cref>. La clase de la referencia a clase <cref> tiene que implementar la interface de la referencia a interface <iref>

− <cref> = <iref>. La clase de <cref> tiene que ser la clase predefinida vacía OBJECT.

En todos lo demás casos se tiene que trabajar con la sentencia MOVE … ?TO o con el operador de asignación ?= en lugar de los usados antes. Cuando se usan estos dos operadores no se realiza el chequeo estático. En su lugar el sistema comprueba en tiempo de ejecución si la referencia al objeto apunta a un objeto al cual puede apuntar. Si la asignación es posible el sistema la realiza y si no lo es genera el error en tiempo de ejecución MOVE_CAST_ERROR .

Siempre que se asigne una referencia a una interface a una referencia a una clase y esta referencia no refiere a la clase OBJECT se tiene que usar este tipo de asignación: <cref> ?= <iref>.

Para que esta asignación ocurra correctamente el objeto al cual apunta <iref> tiene que ser un objeto de la misma clase que el tipo de la variable referenciada a clase <cref>.


Sobre el autor

Publicación académica de Enrique Horacio Lugo Lander, en su ámbito de estudios para el Máster ABAP POO.

SAP SemiSenior

Enrique Horacio Lugo Lander

Profesión: Tsu en Informática - Argentina - Legajo: GB93C

✒️Autor de: 30 Publicaciones Académicas

🎓Egresado del módulo:

Certificación Académica de Enrique Lugo

 

:: Al igual que Enrique ¿Usted está dispuesto a aprender ABAP POO?

El lunes 01 Noviembre 2021 comenzamos el 🎓Máster ABAP POO.
Juntos para realizar sus más grandes desafíos!

 Cargando presentación, aguarde unos instantes...

 

 

+Recursos Gratuitos en CVOSOFT:

¡Lo importante es aprender!, por eso en CVOSOFT la comunidad SAP más grande de habla hispana, ponemos a su alcance los siguientes recursos abiertos libres y gratuitos:

Buscador de Publicaciones:

 

 

Consultas y Soporte

👋Hola! Estamos listos para ayudarle con el soporte que su carrera merece.

Acceda sección contacto y seleccione canal de comunicación más cómodo para usted.

🤝Aguardamos su mensaje, ¡Éxitos!

 


 

👉Que las empresas tomen en serio sus estudios es muy importante para que su inversión educativa tenga sentido.
Las empresas líderes de United States y del Mundo confían a CVOSOFT su recurso más valioso, la formación de su gente.

¿Quieres conocerlas?