SAP Netweaver / ABAP                  Notas técnicas / Tips / Tutorials

Tutorial ABAP Objects: Parte 2

En esta Parte 2 del tutorial de ABAP Objects aprenderemos a crear clases, y a definir sus métodos y atributos utilizando la transacción SE80/SE24. Mediante un ejemplo sencillo aprenderemos paso a paso cómo definir todas las componentes necesarias, y "testearlas" luego desde un programa.

En este artículo se mostrará mediante la creación de un programa ejemplo paso a paso,  la implementación de clases, métodos y otras componentes del universo de ABAP Objects. Dado que este tip es el segundo de una serie, si aún so se conocen las generalidades del modelo de objetos y su reflejo en ABAP, es necesaria la lectura previa del tip Tutorial ABAP Objects: Parte 1. Es importante conocer cómo se materializa en ABAP Objects conceptualmente el paradigma de objetos para comprender el desarrollo del ejemplo.

 

 

Modelo del Ejemplo

Como se explicó en la primera parte del tutorial, en la programación orientada a objetos, la única unidad de estructuramiento son las clases. En lugar de trabajar sobre datos y procedimientos, como en un lenguaje convencional, trabajamos con objetos que encapsulan y auto-contienen  sus datos y la forma de gestionar sobre los mismos. Las clases son una definición abstracta de objetos. Esto significa que la definición o declaración de un objeto es la clase. Luego, los objetos propiamente dichos serán "ejemplares" o "instancias" de una clase cualquiera.

Vimos las propiedades del paradigma de objetos, especialmente la herencia que se produce cuando una clase comparte la estructura y el comportamiento definidos en una o más clases (superclases). (Nota: En ABAP sólo está permitida la herencia simple.)  Vimos asimismo que el objetivo de una interfaz es establecer relaciones entre clases sin usar herencia, ya que a veces no hay una super-clase adecuada para establecer una relación de herencia.

Para ejemplificar algunas características del Paradigma Orientado a Objetos (POO), se van a crear e implementar las clases Z_ANIMAL, Z_VERTEBRADO, Z_INVERTEBRADO y la interfaz ZACCION, para "testearlas" posteriormente en un programa de prueba.

Además, en los ejemplos presentados se reflejará la utilización de:

  • Herencia producida entre las clases Z_ANIMAL a Z_VERTEBRADO y Z_INVERTEBRADO.
  • Polimorfismo al implementar el método COMER definido en la interfaz ZACCION.
  • Encapsulamiento debido a que sólo se logra acceder a datos privados mediante un método como OBTENER_TIPO_ANIMAL.

El diagrama de clases siguiente detalla los componentes (atributos y métodos) de las clases e interfaz que serán utilizados para este ejemplo:

1abap_object_diagrama_clases

Creación y definición de la Interfaz ZACCION

La interfaz es creada para la definición de los métodos que se implementarán en las clases correspondientes.

Pasos de creación de la interfaz

Desde la Tx SE80:

Seleccionar la opción CLASS/INTERFACE, colocar el nombre del objeto a crear y presionar Enter. Luego en el pop-up “Object-type” seleccionar el “radio-button” Interface y hacer click en “Enter”. Finalmente en “Create Interface” se especifica una descripción y clickear en “Save” . Luego, si corresponde, se asignará a una OT.

2abap_object_creacion_zaccion

Paso para la definición de los métodos de la interfaz

Una vez creada la interface, se puede observar sobre el panel de la derecha las diferentes solapas que se utilizan para definir los atributos, métodos, eventos, etc.

Se cambia el modo de visualización a CHANGE y en la solapa METHODS se definen los métodos que utiliza la interfaz, para ello se completan los campos Method, Level y Descripción. Por último se Guarda y Activa.

3abap_object_zaccion_metodos

Creación, definición e implementación de la superclase Z_ANIMAL

La creación de la superclase Z_ANIMAL será necesaria para reflejar los conceptos de Herencia y Polimorfismo. Se van a definir atributos y crear e implementar métodos que heredarán las subclases.

Pasos para la creación de la superclase

Se repite el primer paso de la creación de la interface y se crea un objeto con el nombre Z_ANIMAL. En la ventana ‘Object type’ se elige la opción Class y luego Aceptar.

En la siguiente ventana se desmarca la opción FINAL, se completa con una descripción, luego Aceptar y finalmente asignar un paquete y una OT.

4abap_object_creacion_zanimal

Pasos para la definición atributos y métodos de la superclase

Luego de crear la superclase:

1) Sse cambia el modo de visualización a CHANGE. En este paso se definen los atributos de la superclase, para ello ir a la solapa Attributes, completar los campos requeridos (se señalan en la imagen inferior ampliada) y Guardar.

5abap_object_zanimal_attr

2) En la solapa Methods se definen los métodos de instancia que deberán ser implementados en la superclase. El Constructor es un método particular que se crea al presionar el botón abap-objects-boton-constructor

6abap_object_zanimal_metodos

Pasos para la implementación de los métodos de la superclase Z_ANIMAL

1) Para definir los parámetros de entrada y/o salida de un método, se selecciona el método CONSTRUCTOR y se presiona el botón “Parameters”. El método Constructor requerirá los parámetros de entrada I_PESO, I_COLOR, I_TIPO_ANIMAL e I_SUBTIPO.

Parámetros del método CONSTRUCTOR

7abap_object_zanimal_constructor_params

Nota: No se tiene la opción de seleccionar el tipo de parámetro (importing, exporting, returning, changing) porque en un constructor, los parámetros son siempre de entrada.

Una vez definidas las variables, es necesario implementar el método de la superclase creada. Para ello, Guardar y presionar abap-objects-boton-atras, donde se presenta nuevamente la pantalla de definición de métodos.

2) Para implementar un método, seleccionarlo y hacer Doble Click sobre el mismo. El propósito del método Constructor, en este caso parametrizado, es setear los atributos privados de un objeto. Para ello se deben asignar a los atributos, los valores de los parámetros previamente mencionados. Luego Guardar los cambios.

8abap_object_zanimal_constructor_imp

El código asociado es el siguiente:

METHOD constructor.

peso = i_peso.

color = i_color.

tipo_animal = i_tipo_animal.

subtipo = i_subtipo.

ENDMETHOD.

 

Para implementar los métodos restantes seguir los pasos 1) y 2) de implementación de métodos.

Basándose en los puntos anteriores, se define el parámetro I_RESP y se implementa el método RESPIRACION .

Parámetros del método RESPIRACIÓN

9abap_object_zanimal_respiracion_params

Código para la Implementación del método  RESPIRACIÓN:

METHOD respiracion.

IF i_resp EQ 'Perro'.

WRITE / 'Respiracion: Pulmonar'.

ELSE.

WRITE / 'Respiracion: Branquial'.

ENDIF.

ENDMETHOD.

 

Para el método OBTENER_TIPO_ANIMAL definir el parámetro de retorno R_TIPO_ANIMAL e implementar el método como se muestra a continuación.

Parámetros del método OBTENER_TIPO_ANIMAL

 

10abap_object_zanimal_obtenertipoanimal_params

Código para la Implementación del método OBTENER_TIPO_ANIMAL:

METHOD obtener_tipo_animal.

r_tipo_animal = tipo_animal.

ENDMETHOD.

 

Pasos para agregar la interfaz a la superclase e implementar sus métodos.

1) Finalizadas las implementaciones de los métodos de la superclase, se agrega la interfaz ZACCION creada anteriormente a la misma. Para ello, ir a la solapa Interfaces y escribir el nombre. Luego Guardar y Activar.

11abap_object_zanimal_interfaces

2) Para crear parámetros a un método de la interfaz:

Navegar desde la superclase Z_ANIMAL →  Interfaces →  ZACCION → Methods y seleccionar el método BEBER, luego presionar el botón Parameters y definir el parámetro de entrada I_TIPO_ANIMAL como se muestra a continuación:

12abap_object_zaccion_beber_params

3) Para implementar el método de la interfaz en la superclase Z_ANIMAL:

Navegar la superclase Z_ANIMAL →  Methods → ZACCION y hacer Doble Click sobre el método BEBER. Escribir el siguiente código, luego Guardar y Activar la superclase.

Código para la implementación del método ZACCION~BEBER:

METHOD zaccion~beber.

DATA msj TYPE string.

CONCATENATE 'El animal ' i_tipo_animal 'toma agua'

INTO msj

SEPARATED BY ' '.

WRITE / msj.

ENDMETHOD.

Creación, definición e implementación de la Subclase Z_VERTEBRADO

Se crea una subclase que contendrá atributos y métodos propios, y donde se verá reflejado la herencia y polimorfismo.

Pasos para la creación de la subclase Z_VERTEBRADO

1) Se crea el objeto Z_VERTEBRADO y Aceptar. Para realizar la herencia seleccionar el botón abap-objects-boton-herencia en la solapa de “Properties” y colocar el nombre de la superclase (Z_ANIMAL), una Descripción y marcar la opción Final. De esta manera se indica que la subclase Z_VERTEBRADO heredará las componentes de la superclase Z_ANIMAL. La opción Final indica que Z_VERTEBRADO no tendrá subclases.

13abap_object_zvertebrado_creacion_y_superclase

2) Se visualizan los métodos heredados de la superclase Z_ANIMAL. Se Activa la subclase Z_VERTEBRADO para reflejar los métodos implementados (marcados en celeste en la imagen siguiente) y los que deben redefinirse (marcados en negro) heredados de la superclase.

14abap_object_zvertebrado_metodos_heredados

La subclase Z_VERTEBRADO contendrá el atributo CUALIDAD y los métodos MOSTRAR_CARACTERISTICAS y CONSTRUCTOR. Seguir los pasos 1) y 2) de definición e implementación de la superclase.

1) Definir el atributo de la subclase Z_VERTEBRADO

15abap_object_zvertebrado_atributos

2) En la solapa Methods definir el método MOSTRAR_CARACTERISTICAS. Para la creación del CONSTRUCTOR, presionar el botón abap-objects-boton-constructor Se elige la opción ‘No’, para no copiar el constructor de la superclase y crear uno propio.

16abap_object_popup

 

De esa manera quedan detallados los métodos definidos de la subclase Z_VERTEBRADO:

17abap_object_zvertebrado_metodos_todos

3) Se muestra los parámetros del Constructor:

18abap_object_zvertebrado_constructor_params

Se implementa el método del CONSTRUCTOR al escribir el siguiente código, que invoca al constructor de la superclase y setea los atributos correspondientes. Todos los atributos salvo “cualidad”, son especificados por el constructor de la clase padre que es invocado a través de la palabra “super”.

Código para la Implementación de CONSTRUCTOR:

METHOD constructor.

CALL METHOD super->constructor

EXPORTING

i_peso        = i_sub_peso

i_color       = i_sub_color

i_tipo_animal = i_sub_tipo_animal

i_subtipo     = i_sub_subtipo.

cualidad = i_cualidad.

ENDMETHOD.

4) Se definen los parámetros de entrada/salida del método MOSTRAR_CARACTERISTICAS.

 

19abap_object_zvertebrado_mostrar_caracteristicas_params

Por último, se escribe la implementación del método MOSTRAR_CARACTERISTICAS:

Código para la Implementación del método  MOSTRAR_CARACTERISTICAS:

METHOD mostrar_caracteristicas.

IF i_tipo_animal EQ 'Perro'.

cualidad = 'Tiene 4 patas y camina'.

ELSE.

cualidad = 'No tiene patas y nada'.

ENDIF.

r_cualidad = cualidad.

ENDMETHOD.

Redefinición de un método de la interfaz Z_ACCION.

Las clases pueden redefinir un método heredado de una superclase o definido en una interfaz para cumplir un propósito específico.

1) En este caso se redefine el método COMER definido en la interfaz ZACCION. Dentro del árbol generado por los pasos anteriores, seleccionar el método COMER, luego presionar botón derecho y elegir la opción Redefine.

20abap_object_zvertebrado_redefinir_comer

2) Al igual que los métodos implementados anteriormente, se necesitará definir un parámetro (en este caso, un parámetro de entrada) en la Interfaz ZACCION y su correspondiente implementación en la clase Z_VERTEBRADO. Luego se Guarda y se Activa.

Parámetros de del método ZACCION~COMER (definidos en la interfaz ZACCION):

 

21abap_object_zaccion_comer_params

 

 

Nota: Desde la pantalla que se visualiza a continuación no es posible modificar los parámetros de entrada o salida ya que los mismos son definidos en la interfaz. Una clase que usa dicha interfaz, únicamente implementa sus métodos respetando los parámetros de cada uno. Los parámetros pueden ser modificados desde la interfaz únicamente.

Código para la Implementación del método ZACCION~COMER:

METHOD zaccion~comer.

CALL METHOD super->zaccion~comer

EXPORTING

i_tipo_animal = i_tipo_animal.

IF i_tipo_animal EQ 'Perro'.

WRITE / 'Los Perros comen hueso'.

ELSE.

WRITE / 'Los Peces comen larvas'.

ENDIF.

ENDMETHOD.

 

Pasos para la creación de la Subclase Z_INVERTEBRADO

Para la subclase Z_INVERTEBRADO solo será necesario crear un CONSTRUCTOR y redefinir el método OBTENER_TIPO_ANIMAL. Esta clase no contendrá atributos y métodos propios.

1) La creación de esta subclase, requiere repetir los pasos de la creación de la subclase Z_VERTEBRADO. A continuación se muestra los componentes heredados:

22abap_object_zinvertebrado_displayobject

2) Desde la solapa Methods presionar el botón CONSTRUCTOR y definir los parámetros para ese método (como se vé en la iamgen ampliada):

23abap_object_zinvertebrado_constructor_params

Código para la Implementación del método  CONSTRUCTOR:

METHOD constructor.

CALL METHOD super->constructor

EXPORTING

i_peso        = i_sub_peso

i_color       = i_sub_color

i_tipo_animal = i_sub_tipo_animal

i_subtipo     = i_sub_subtipo.

ENDMETHOD.

Pasos para Redefinir el método COMER de la interfaz Z_ACCION.

El paso de redefinición del método COMER se repite del ya mencionado para la clase Z_VERTEBRADO.

1) Se muestra el parámetro utilizado (definido en la interfaz Z_ACCION) y la implementación del método COMER en Z_VERTEBRADO.

24abap_object_zaccion_comer_params

 

Código para la Implementación del método ZACCION~COMER:

METHOD zaccion~comer.

CALL METHOD super->zaccion~comer

EXPORTING

i_tipo_animal = i_tipo_animal.

DATA msj TYPE string.

CONCATENATE 'Los invertebrados como la' i_tipo_animal

'comen materia orgánica presente en el suelo' INTO msj

SEPARATED BY ' '.

WRITE / msj.

ENDMETHOD.

Creación del programa ZPRUEBA para testear todas las componentes definidas anteriormente

Se crea el programa ZPRUEBA y se utiliza el código siguiente para probar los métodos implementados.

REPORT  zprueba.

* Crear refencias (perro, salmón, lombriz) a sus respectivas clases.

DATA: perro TYPE REF TO z_vertebrado,

salmon TYPE REF TO z_vertebrado,

lombriz TYPE REF TO z_invertebrado,

nombre TYPE char20,

info TYPE string,

msj TYPE string.

START-OF-SELECTION.

* Crear instancias de referencia que apuntan a un objeto de la clase Z_VERTEBRADO

CREATE OBJECT perro

TYPE

z_vertebrado

EXPORTING

i_sub_peso        = 10

i_sub_color       = 'Negro'

i_sub_tipo_animal = 'Perro'

i_sub_subtipo     = 'Mamífero'

i_cualidad        = ' '.

CREATE OBJECT salmon

TYPE

z_vertebrado

EXPORTING

i_sub_peso        = 5

i_sub_color       = 'Gris'

i_sub_tipo_animal = 'Salmón'

i_sub_subtipo     = 'Pez'

i_cualidad        = ' '.

* Creo instancias de referencia que apuntan a un objeto de la clase Z_INVERTEBRADO

CREATE OBJECT lombriz

TYPE

z_invertebrado

EXPORTING

i_sub_peso        = 1

i_sub_color       = 'Rosa'

i_sub_tipo_animal = 'Lombriz'

i_sub_subtipo     = 'Anélidos'.

 

* Desde la referencia PERRO

* Utiliza los métodos heredados de la superclase Z_ANIMAL

nombre = perro->obtener_tipo_animal( ).

CONCATENATE 'El animal es ' nombre INTO msj SEPARATED BY ' '.

WRITE / msj.

 

salmon->respiracion( nombre ).

 

*Utilizo el método de la subclase Z_VERTEBRADO.

info = perro→mostrar_caracteristicas( nombre ).

WRITE / info.

 

*Utilizo métodos de la interfaz.

perro->zaccion~beber( EXPORTING i_tipo_animal = nombre ).

perro->zaccion~comer( EXPORTING i_tipo_animal = nombre ).

 

SKIP 2.

 

*Desde la referencia SALMON

 

nombre = salmon->obtener_tipo_animal( ).

CONCATENATE 'El animal es ' nombre INTO msj SEPARATED BY ' '.

WRITE / msj.

salmon->respiracion( nombre ).

info = salmon->mostrar_caracteristicas( nombre ).

WRITE / info.

 

salmon->zaccion~beber( EXPORTING i_tipo_animal = nombre ).

salmon->zaccion~comer( EXPORTING i_tipo_animal = nombre ).

 

SKIP 2.

 

*Desde la referencia LOMBRIZ

 

*Utilizo los métodos heredados de la superclase Z_ANIMAL

nombre = lombriz->obtener_tipo_animal( ).

 

CONCATENATE 'El animal es ' nombre INTO msj SEPARATED BY ' '.

WRITE / msj.

 

lombriz->zaccion~beber( EXPORTING i_tipo_animal = nombre ).

lombriz->zaccion~comer( EXPORTING i_tipo_animal = nombre ).

 

Una vez ejecutado el programa, la salida es la siguiente:

abap-object-salida-reporte-ZPRUEBA


n_Celeste-Coopa Especialista ABAP
n_Guido-Falcucci Especialista ABAP

 


Copyright 2012 - Teknoda S.A.

IMPORTANTE:
“Notas técnicas de SAP ABAP" se envía con frecuencia variable y sin cargo como servicio a nuestros clientes SAP. Contiene notas/tutoriales/artículos técnicos desarrollados en forma totalmente objetiva e independiente. Teknoda es una organización de servicios de tecnología informática y NO comercializa hardware, software ni otros productos.
Si desea suscribir otra dirección de e-mail para que comience a recibir las Notas Técnicas SAP, envíe un mensaje desde esa direcciónsapping@teknoda.com, aclarando nombre, empresa, cargo y país del suscriptor.

SAP, Netweaver, R/3, Fiori,S4/HANA y ABAP son marcas registradas de SAP AG. SAP no es el editor de esta publicación y no es responsable de la misma en ningún aspecto. La información contenida en esta publicación ha sido generada por nuestros especialistas a partir de fuentes consideradas confiables y del ejercicio profesional cotidiano. No obstante, por la posibilidad de error humano, mecánico, cambio de versión u otro, Teknoda no garantiza la exactitud o completud de la misma.
COPYRIGHT TEKNODA S.A. PROHIBIDA SU REPRODUCCION TOTAL O PARCIAL SIN CONSENTIMIENTO DE TEKNODA

 

Copyright © 2024 Teknoda Tech Portal & Training. Todos los derechos reservados.
Joomla! es software libre, liberado bajo la GNU General Public License.