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:
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.
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.
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.
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.
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
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
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 , 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.
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
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
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.
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:
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 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.
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.
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
2) En la solapa Methods definir el método MOSTRAR_CARACTERISTICAS. Para la creación del CONSTRUCTOR, presionar el botón Se elige la opción ‘No’, para no copiar el constructor de la superclase y crear uno propio.
De esa manera quedan detallados los métodos definidos de la subclase Z_VERTEBRADO:
3) Se muestra los parámetros del Constructor:
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.
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.
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):
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:
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):
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.
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:
Especialista ABAP |
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. |