38
Tutorial ABAP Objects: Parte 1 inShare 12 Conozca el universo de la programación orientada a objetos en SAP implementada con ABAP Objects. En este “tip”, el primero de la serie de Tutoriales de ABAP Objects, veremos conceptualmente cómo se implementa el paradigma de objetos en el mundo SAP. En los próximos artículos se tratarán en detalle ejemplos de programación paso a paso, y otras características del entorno. La programación orientada a objetos (POO) es una filosofía de diseño y desarrollo de software donde el modelo informático es un reflejo de las entidades del mundo real. A diferencia de los lenguajes tradicionales, donde existen procedimientos por un lado y datos por el otro, la POO permite a los programadores representar cada entidad del problema como un objeto “encapsulado” que contiene tanto sus datos y cómo los “comportamientos” gestionan sobre ellos. Valiéndose de un lenguaje y entorno que respete los principios de la teoría de objetos, los objetos se crean a partir de una definición ”abstracta” de los mismos, denominada “clase”, que describe sus características y comportamientos. Los objetos concretos luego serán “ejemplares” o “instancias”de esa "plantilla" abstracta que es la clase. Por ejemplo, clases y objetos típicos del entorno de negocios son "Clientes", "Materiales", "Ordenes de compra", etc. La teoría de objetos se estructura alrededor en un conjunto de propiedades y paradigmas conceptuales (que exceden el alcance de este artículo), implementados luego en los distintos entornos de programación. Existen, numerosas y probadas ventajas asociadas a la programación orientada objetos que incluyen el encapsulamiento de la complejidad, la reusabilidad del código, la modularidad, entre otros. La programación orientada a objetos representó una verdadera revolución en el universo del desarrollo de software, impulsando a programadores, analistas y arquitectos de sistemas a re-aprender su forma de concebir código y aplicaciones. En una primera instancia, lenguajes como C++, y luego JAVA, se convirtieron en los entornos de programación OO más emblemáticos. En el mundo SAP, el instrumento que disponemos en ABAP para trabajar de acuerdo a este paradigma son los "ABAP Objects". La introducción de ABAP Objects en el Release 4.6 representó un avance fundamental para incorporar técnicas de programación contemporáneas en un lenguaje tradicionalmente procedural. Sin embargo, la plena materialización del paradigma de objetos en el mundo SAP, llegó recién a partir de la versión 6.10, con el advenimiento del Web Application Server como sucesor de SAP Basis. El concepto de ABAP Objects representa dos cosas distintas en el mundo SAP. Por un lado, designa a la concepción de toda la plataforma de ejecución como un nuevo paradigma de trabajo. Por otro lado, designa a

Tutorial ABAP Objects

Embed Size (px)

DESCRIPTION

Tutorial de Objetos ABAP

Citation preview

Page 1: Tutorial ABAP Objects

Tutorial ABAP Objects: Parte 1inShare12

Conozca el universo de la programación orientada a objetos en SAP implementada con ABAP Objects. En este “tip”, el primero de la serie de Tutoriales de ABAP Objects, veremos conceptualmente cómo se implementa el paradigma de objetos en el mundo SAP. En los próximos artículos se tratarán en detalle ejemplos de programación paso a paso, y otras características del entorno.

La programación orientada a objetos (POO) es una filosofía de diseño y desarrollo de software donde el modelo informático es un reflejo de las entidades del mundo real. A diferencia de los lenguajes tradicionales, donde existen procedimientos por un lado y datos por el otro, la POO permite a los programadores representar cada entidad del problema como un objeto “encapsulado” que contiene tanto sus datos y cómo los “comportamientos” gestionan sobre ellos.

Valiéndose de un lenguaje y entorno que respete los principios de la teoría de objetos, los objetos se crean a partir de una definición ”abstracta” de los mismos, denominada “clase”, que describe sus características y comportamientos. Los objetos concretos luego serán  “ejemplares” o “instancias”de esa "plantilla" abstracta que es la clase. Por ejemplo, clases y objetos típicos del entorno de negocios son "Clientes", "Materiales", "Ordenes de compra", etc.

La teoría de objetos se estructura alrededor en un conjunto de propiedades y paradigmas conceptuales (que exceden el alcance de este artículo), implementados luego en los distintos entornos de programación. Existen, numerosas y probadas ventajas asociadas a la programación orientada objetos que incluyen el encapsulamiento de la complejidad, la reusabilidad del código, la modularidad, entre otros.

La programación orientada a objetos representó una verdadera revolución en el universo del desarrollo de software, impulsando a programadores, analistas y arquitectos de sistemas a re-aprender su forma de concebir código y aplicaciones. En una primera instancia, lenguajes como C++, y luego JAVA, se convirtieron en los entornos de programación OO más emblemáticos.

En el mundo SAP, el instrumento que disponemos en ABAP para trabajar de acuerdo a este paradigma son los "ABAP Objects".

La introducción de ABAP Objects en el Release 4.6 representó un avance fundamental para incorporar técnicas de programación contemporáneas en un lenguaje tradicionalmente procedural. Sin embargo, la plena materialización del paradigma de objetos en el mundo SAP, llegó recién a partir de la versión 6.10, con el advenimiento del Web Application Server como sucesor de SAP Basis.

El concepto de ABAP Objects representa dos cosas distintas en el mundo SAP. Por un lado, designa a la concepción de toda la plataforma de ejecución como un nuevo paradigma de trabajo. Por otro lado, designa a la nueva extensión del lenguaje ABAP.

El propósito de este “tip”, el primero de la serie de Tutoriales de ABAP Objects, es entender  conceptualmente cómo se refleja el paradigma de objetos en el mundo SAP. No es el propósito de este tutorial definir en detalle la teoría de objectos en su vasta dimensión, sino discutir su implementación en el universo de ABAP Objects.

En los próximos artículos se tratarán en detalle ejemplos de programación paso a paso, y otras características del entorno.

Los paradigmas de Orientación a Objetos en ABAP Objects

Como se dijo anteriormente, el lenguaje ABAP y el entorno de programación SAP, logra a partir de una nueva versión con extensión orientada a objetos, el diseño de nuevas aplicaciones, basadas en la teoría de objetos.

Page 2: Tutorial ABAP Objects

Comparado con otros, ABAP no es un lenguaje “puro” orientado a objetos. El runtime de ABAP soporta tanto el modelo de programación procedural como el de ABAP Objects en cualquier programa ejecutable, módulos o funciones.

Esto permite la utilización de nuevas técnicas basadas en ABAPsin necesidad de re-escribir todo el código.

Propiedades de un paradigma orientado a objetos:Son precisamente las propiedades del paradigma de objetos lo que le otorga su singularidad y todas las ventajas de modularidad cuando se plasman en la programación.

Encapsulamiento: Es el término que define formalmente la fusión dentro del mismo objeto de sus datos y métodos (comportamiento). Los objetos son tratados como “caja negra”, de manera que sólo sus métodos pueden actuar sobre sus datos, brindando independencia en la implementación de los mismos..

Abstracción: Permite a un objeto comunicarse y desconocer el forma en que se lleva a cabo el mensaje.

Polimorfismo: Capacidad que tienen objetos de distintas clases de responder a un mismo método y obtener diferentes reacciones.

Herencia: Se produce cuando una clase (la subclase) comparte la estructura (atributos) y el comportamiento (métodos) definidos en una o más clases (superclases). (Nota: En ABAP sólo está permitida la herencia simple.)

Obviamente, estas propiedades se ven reflejadas en la implementación de POO que hace ABAP

Page 3: Tutorial ABAP Objects

Objects.

Es interesante contrastar las capacidades de ABAP Objects con las de otros lenguajes OO populares, en términos de cómo se ciñe al modelo POO.

Cuadro de diferencia entre los lenguajes de programación orientado a objetos:

CaracterísticasABAP JAVA C++

Se permite herencia múltiple

No No Si

Es un lenguaje puro orientado a objetos

NO SI NO

Liberación de objetos de forma automática

SI SI NO

Existe el concepto “interfaz”

SI SI NO

Heredan de la clase OBJECT

SI SI NO

Manejo de parámetros opciones de forma

explicita

Si NO NO

Los programas se ejecutan sobre…

Application Server ABAP

Procesador virtual JMV (Java Virtual Machine)

Sobre el sistema operativo

Describiremos a continuación las principales sentencias que se utilizan en ABAP para trabajar con objetos.

A – Clases en ABAP ObjectsEn 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" de una clase cualquiera. Esta acción de crear un objeto a partir de una clase se llama instanciar, por eso se conocen a los objetos como instancias de una clase.

Las propiedades o atributos de una clase en una clase conforman las características de los objetos. Estos atributos están definidos por las componentes de la clase que describe el estado (los datos).

Tipos de clases: Globales Vs. Locales

Las clases en ABAP Objects pueden ser declaradas globalmente o localmente. Así como existe una manera de definir un Function Group o un Function Module desde el ABAP Workbench para ser usados en la programación ABAP tradicional, también es posible definir las clases globales y las interfaces en el ABAP Workbench mediante el Class Builder (Transaction SE24). Estas clases son almacenadas centralmente en pools de clases en la biblioteca de clases dentro del repositorio de SAP.

Todos los programas ABAP en un sistema SAP pueden acceder a las clases globales. Las clases

Page 4: Tutorial ABAP Objects

locales son las que se definen dentro de un programa ABAP. De esta manera, las interfaces y las clases locales pueden ser usadas solamente en el programa en donde están definidas. Cuando se usa una clase en un programa ABAP, el sistema primero busca una clase local con el nombre especificado. Si no se encuentra ninguna, busca una clase global.

Definición de una clase local

La definición completa de una clase en ABAP Objects consiste en una sección de declaración, y otra de implementación, ambas iniciadas con la sentencia CLASS.

Sentencia para la declaración de una clase local:

CLASS <class> DEFINITION.

ENDCLASS.

Sentencia para la implementación de una clase local:

CLASS <class> IMPLEMENTATION.

ENDCLASS.

B - Componentes de una claseLos componentes de una clase conforman su contenido, y se declaran en la parte declarativa del código. Definen las propiedades de los objetos de esa clase.

Cuando la clase se define, cada componentes se asocia a una de las tres posibles secciones de visibilidad: público, protegido o privado. Las secciones de visibilidad definen la interfaz externa de la clase.(ver apartado sobre visibilidad más abajo)

Todos los componentes son visibles dentro de la clase, y comparten el mismo espacio de nomenclatura, por lo que cada componente debe tener un nombre unívoco dentro de su clase.

Se implementan en ABAP dos tipos de componentes en una clase, aquellos que existirán en cada uno de los objetos o instancias de clase, adquiriendo valor separadamente uno para cada objeto, y aquellos que existen sólo una vez para la clase entera, independientemente de la cantidad de instancias, denominados componentes ESTATICOS. A los primeros, en cambio, se los llama componentes específicos de instancia.

Las componentes de una clase son los atributos, los métodos, los eventos, los tipos y las constantes.

Page 5: Tutorial ABAP Objects

B-1 AtributosEn ABAP los atributos son los campos internos de DATOS definidos para la clase. Pueden declararse a partir de cualquier tipo de dato válido en ABAP. En cada instancia de clase los atributos reflejarán el estado del objeto (es decir, los datos del objeto). Respetando la clasificación general enunciada para los componentes de clase, tendremos dos tipos de atributos: los específicos de instancia, y los estáticos.

Atributos dependientes de instancia. El contenido de estos atributos define el estado propio e individual de cada objeto en cada instancia de clase. Se declaran usando la sentencia DATA.Los atributos ESTATICOS. Definen el estado de la clase válido para todas las instancias de la mismo. Existen, por lo tanto, sólo una vez para la clase, y son accesibles durante todo el runtime de la clase. Todos los objetos pueden acceder a sus atributos estáticos de su clase, y si se cambia un atributo estático en un objeto, el cambio es visible en todos los demás objetos de la clase.

B– 2 MétodosLas funcionalidades asociadas a los objetos se definen a través de los métodos, que de esa forma determinan el comportamiento de los objetos. Los métodos son procedimientos que definen el comportamiento de un objeto, su funcionalidad asociada. Se utilizan para acceder a los atributos privados de una clase, como también modificarlos mediante una interfaz con parámetros que les permite recibir valores y devolver valores después de la llamada.

En ABAP, un método se define en la parte declarativa de la clase y luego se implementa en la parte de implementación. Nuevamente, por ser componentes de clase, cabe la misma diferenciación en métodos dependientes de instancia, y estáticos.

METODOS dependientes de la instancia: Se declaran usando la sentencia METHODS y pueden acceder a todos los atributos de una clase y desencadenar algún evento de la misma.Métodos estáticos (independientes de instancia): Se declaran usando la sentencia CLASS-METHODS. Sólo pueden acceder a los atributos estáticos y desencadenar eventos estáticos.

Declaración de métodos

Métodos   dependientes   de instancia

METHODS <meth>

IMPORTING.. [VALUE(]<ii>[)] TYPE type [OPTIONAL]..

EXPORTING.. [VALUE(]<ei>[)] TYPE type [OPTIONAL]..

CHANGING.. [VALUE(]<ci>[)] TYPE type [OPTIONAL]..

RETURNING VALUE(<r>)

EXCEPTIONS.. <ei>..

Para declarar   métodos estáticos   se usa se usa la siguiente sentencia:

Page 6: Tutorial ABAP Objects

CLASS-METHODS <meth>..

IMPORTING.. [VALUE(]<ii>[)] TYPE type [OPTIONAL]..

EXPORTING.. [VALUE(]<ei>[)] TYPE type [OPTIONAL]..

CHANGING.. [VALUE(]<ci>[)] TYPE type [OPTIONAL]..

RETURNING VALUE(<r>)

EXCEPTIONS.. <ei>..

Implementación de métodos

Cuando se implementa un método no es necesario  especificar los tipos de datos de los parámetros, debido a que se encuentran ya se encuentran definidos en la declaración. En un método se pueden declarar tanto las variables locales, como también usar las sentencias RAISE <exception> yMESSAGE RAISING para controlar los errores.

METHOD <meth>

IMPORTING..[VALUE(]<ii>[)]

EXPORTING..[VALUE(]<ei>[)]

CHANGING.. [VALUE(]<ci>[)]

RETURNING VALUE(<r>)

EXCEPTIONS.. <ei>..

ENDMETHOD.

Nota: Los métodos estáticos sólo pueden trabajar con los atributos estáticos de la clase.

Llamadas al método

Las llamadas al método dependerán de dónde se lo invoque:

En la parte de implementación de una clase se pueden llamar directamente métodos de la misma clase simplemente usando su nombre.

CALL METHOD <meth>.

Page 7: Tutorial ABAP Objects

Desde fuera de la clase, sólo se llama a los métodos cuya visibilidad nos permite hacerlo.

CALL METHOD <cref>-><meth>.

A partir de 6.10 se puede llamarlo así: <cref>-><meth> directamente, sin la palabra clave CALL METHOD

donde <cref> es una variable de referencia cuyo valor apunta a una instancia de la clase.

Los métodos visibles estáticos también pueden ser llamados

CALL METHOD <class>=><meth>.

A partir de 6.10 se puede llamarlo así: <class>=><meth>

donde <class> es el nombre de la clase.

En un método los pasajes de parámetros de entrada son opcionales; dentro del método se declaran con el tipo IMPORTING. En cambio los de salida, no son optativos y se utiliza como tipo a EXPORTING o RETURNING. En el caso de RETURNING sólo se admite un único parámetro de salida y se puede combinar únicamente con parámetros declarados como IMPORTING. El caso de CHANGING también puede ser opcional.

B-3 ConstructoresLos constructores son un tipo especial de métodos y su definición e implementación es igual que cualquier otro método. Son llamados automáticamente por el sistema (cuando se crea un objeto, es decir, cuando se crea una instancia, mediante la sentencia CREATE OBJECT),  para fijar el estado inicial de un nuevo objeto o clase (constructor estático). Los constructores, tanto si están parametrizados como si no lo están,  para ser implementados deben estar declarados explícitamente, y en su declaración se puede contemplar el manejo de errores.

Declaración de constructor:

El constructor dependiente de instancia

METHODS CONSTRUCTOR

IMPORTING..[VALUE(]<ii>[)] TYPE type [OPTIONAL].

EXCEPTIONS..<ei>.

El constructor estático, no contiene parámetros y es llamado una vez por cada clase

CLASS-METHODS CLASS_CONSTRUCTOR.

Implementacion de un constructor:

Page 8: Tutorial ABAP Objects

Dependiente de la instancia

METHOD CONSTRUCTOR.

ENDMETHOD.

Independiente ó estático.

METHOD CLASS_CONSTRUCTOR.

B-4 EventosUn evento es una acción que se ejecuta dinámicamente. Son usados por los objetos o las clases para desencadenar métodos en otros objetos o clases, llamados por los usuarios.  Son semejantes de los métodos, sin embargo solo poseen parámetros de salida pasados por el disparador y el método manejador los recibe como entrada.

Cuando un evento es disparado por un disparador de evento (trigger), el correspondiente método manejador de eventos (event handler methods) es ejecutado en todas las clases registradas por ese manejador (son los objetos registrados; clases es en el caso que sea estatico pero es poco común. Puede haber 2 objetos de una misma clase en el cual el primero está registrado/subscripto al evento de un tercer objeto pero el segundo no), el cual determina los eventos  que deben reaccionar.  La relación entre el disparador y el método manejador de eventos se realiza en tiempo de ejecución.

Lanzamiento de un evento

RAISE EVENT <evt>.

Declaración de un método manejador de eventos para la misma o diferente clase

FOR EVENT <evt> OF <class>.

Vinculo entre el disparador y el manejador (trigger y handler):

SET HANDLER.

Clasificación de eventos

Eventos dependientes de instancia: Son declarados con la sentencia EVENTS <evt> y solo pueden ser desencadenados en un método dependiente de instancia.

Page 9: Tutorial ABAP Objects

Eventos estáticos o independientes de instancia: Se declaran con la sentencia CLASS-EVENTS y solo pueden desencadenarse por un método estático de la clase.

B-5 Tipos y ConstantesLos tipos se datos se declaran dentro de la clase por única vez y se realiza utilizando la sentenciaTYPES.

Las constantes permiten que dar a un objeto de dato interno un valor fijo durante su declaración y éste no puede ser modificado. La sentencia usada es CONSTANTS.

B-6 VisibilidadLos componentes de una clase se pueden declarar en tres áreas de distinta visibilidad: Cuando la clase se define, cada componentes se asocia a una de las tres posibles secciones de visibilidad: público, protegido o privado. Las secciones de visibilidad definen la interfaz externa de la clase.

CLASS <class> DEFINITION.

PUBLIC SECTION.

PROTECTED SECTION.

PRIVATE SECTION.

ENDCLASS.

Tipos de visibilidad:

Public section: Permite que los componentes pueden ser accedidos por todos los usuarios de la clase, métodos de la clase y además por cualquier clase que herede de ella.Protected section: Los componentes solo logran ser accedidos por los métodos de la clase y de las clases que heredan de ellaPrivate section: Los componentes sólo serán accedidos por métodos de la misma clase.

Todos los componentes son visibles dentro de la clase, y comparten el mismo espacio de

Page 10: Tutorial ABAP Objects

nomenclatura, por lo que cada componente debe tener un nombre unívoco dentro de su clase.

C- ObjetosLos objetos son entidades tangibles de una clase que residen dentro de un contexto de una sesión interna (área de memoria de un programa ABAP).

Características de un objeto:

El estado, los valores concretos (datos) asignados a los atributos.El comportamiento, se define por los procedimientos que puede realizar un objeto.La identidad es una propiedad de un objeto que lo diferencia del resto, como es el nombre.

Creación de un objeto

La sentencia CREATE OBJECT <cref> crea una instancia de una clase. La variable referenciada <cref> contiene la referencia al objeto.

Acceder a los componentes de un objeto

Para acceder a un componente de un objeto dependerá del tipo de componente y desde dónde se quiere invocar. Se detallas las 3 maneras distintas de lograrlo.

Los programas ABAP sólo pueden acceder a los componentes de las instancias de un objeto usando las variables referenciadas <cref>.

Para acceder al atributo attr: class->attr.Para llamar al método meth: CALL METHOD cref->meth.

Para los componentes estáticos (dependientes de clase) se puede usar tanto el nombre de la clase como la variable referenciada.

Para acceder al atributo estático attr: class=>attr.Para llamar al método estático meth: CALL METHOD class=>meth.

Dentro de una clase se puede acceder también a los componentes individuales mediante la referencia a sí mismo ME:

Para acceder al atributo attr en la propia clase: me->attr. (también se acepta sólo  attr )

Page 11: Tutorial ABAP Objects

Para llamar al método meth en la propia clase: CALL METHOD me->meth.

Tiempo de vida de un objeto

Un objeto solo puede seguir existiendo siempre y cuando haya una referencia a un objeto ó cuando un objeto maneja el evento de otro objeto (handler). De lo contrario el objeto es borrado de la memoria automáticamente.

Referencias

Las variables de referencia permiten acceder a los objetos. En vez de crear variables de referencia con referencia a una clase, se las puede definir con referencia a una interfaz. Este tipo de variables únicamente puede contener referencias a objetos de clases que implementan la interfaz correspondiente.

Se la define mediante la adición TYPE REF TO <intf>.

Si se desea crear una nueva instancia de la clase que implementa esta interfaz, se lo debe hacer mediante la sentencia:

CREATE OBJECT <iref> TYPE <aclass>, donde <iref> es una variable de referencia a interfaz y <aclass> la clase que implementa a <intf>

Si la instancia ya existe se puede hacer la siguiente asignación entre la variable de referencia a clase y la variable de referencia a interfaz:

<iref> = <cref>.

Cuando se quiere acceder a un componente definido en la interfaz <intf> mediante la variable de referencia a clase <cref> se lo debe hacer mediante la siguiente forma:

<cref>-><intf~compi>

Pero cuando se accede mediante <iref> se lo hace a través de la forma:

<iref>-><compi>.

Definición de una referencia a un objeto:

… TYPE REF TO <class>.

D- Herencia de clasesLa herencia se realiza entre dos clases (una superclase y una subclase). La subclase heredará los componentes públicos y privados de la superclase, logrando el mismo comportamiento. Teniendo la posibilidad de extender o limitar ese comportamiento para proveer una acción

Page 12: Tutorial ABAP Objects

requerida.

Cabe aclarar que aunque hereda los componentes privados, éstos NO son visibles dentro de la subclase. Es decir, no puede hacer referencia directamente a atributos privados y alterarlos. Se van a poder manipular únicamente si en la superclase hay métodos public o protected que lo permiten.

El nodo raíz de todos los árboles de herencia en ABAP Objects es la clase predefinida vacíaOBJECT.

Definición para una herencia:

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

Nota: Los atributos estáticos sólo existen una vez y son visibles en todas las clases del árbol de herencia.

Debido a que los constructores no se heredan, hay existen dos maneras de implementarlo que dependerá de si existe dependencia ó no a una instancia.

Constructores dependientes de instancia

Un constructor dependiente de instancia de una subclase solo se ejecutara si todos los constructores dependientes de la superclase son llamados.

Llamado al constructor de la superclase.

CALL METHOD SUPER->CONSTRUCTOR EXPORTING…

Page 13: Tutorial ABAP Objects

Constructores estáticos

Se ejecuta de la misma manera que los constructores dependientes de la instancia solo varia en la declaración de la implementación.

Llamado al constructor de la superclase.

CLASS_CONSTRUCTOR.

Clases y métodos abstractos y finalesLas  sentencias METHODS y CLASS mediante las adiciones ABSTRACT y FINAL permiten definir tanto a los métodos como a las clases de forma abstracta o final.

Diferencias:

Un método abstracto solo se puede definirse en una clase abstracta y puede ser implementado en sus respectivas subclases.Las clases abstractas no pueden ser instanciadas. Son utilizadas para la declaración de métodos no abstracto, pero al menos debe contener un método abstracto.

Un método final es la manera de proteger métodos para no ser redefinidos por las subclases.Las clases finales no pueden tener subclases, debido a que son las que finalizan el árbol de herencia.  De forma implícita todos sus métodos son “final”.

E- InterfazEl 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.

Una interfaz no puede instanciar objetos, sin embargo pueden definirse atributos static y final. Se utiliza principalmente para la definición de métodos abstractos, por lo cual la implementación se realiza en otras clases. Todos los componentes son visibles para las clases en donde se implementan los métodos definidos.

Definición de interfaz

INTERFACE <intf>.…ENDINTERFACE.

Implementación de la   interfaz   (la implementación debe estar dentro de una clase que usa esta interfaz)

METHOD <intf~imeth>.…

Page 14: Tutorial ABAP Objects

ENDMETHOD.

Referencias a interfaces

Las variables de referencia permiten acceder a los objetos. En vez de crear variables de referencia con referencia a una clase, se las puede definir con referencia a una interfaz. Este tipo de variables únicamente puede contener referencias a objetos de clases que implementan la interfaz correspondiente.

Se la define mediante la adición TYPE REF TO <intf>.

Si se desea crear una nueva instancia de la clase que implementa esta interfaz, se lo debe hacer mediante la sentencia:

CREATE OBJECT <iref> TYPE <aclass>, donde <iref> es una variable de referencia a interfaz y <aclass> la clase que implementa a <intf>

S la instancia ya existe se puede hacer la siguiente asignación entre la variable de referencia a clase y la variable de referencia a interfaz:

<iref> = <cref>.

Cuando se quiere acceder a un componente definido en la interfaz <intf> mediante la variable de referencia a clase <cref> se lo debe hacer mediante la siguiente forma:

<cref>-><intf~compi>

Pero cuando se accede mediante <iref> se lo hace a través de la forma:

<iref>-><compi>.

F- ExceptionEs una situación que ocurre durante la ejecución de un programa que interrumpe o cambia su normal comportamiento. La idea fundamental es que tales situaciones puedan ser manejadas de alguna forma. Las excepciones son representadas por una instancia de una clase “excepción”. Los atributos de tal objeto van a contener información acerca de la situación ocurrida.

Una excepción puede ser “levantada” con la sentencia RAISE EXCEPTION. Cuando esto ocurre, el sistema busca un manejador adecuado que se haga cargo y en el caso de no encontrarlo, se produce un error en tiempo de ejecución. Este manejo se puede llevar únicamente a cabo si la sentencia que podría ocasionar que se levante la excepción, se encuentra encerrada por el bloque TRY-ENDTRY.Específicamente, el manejo de la excepción se realiza con la sentencia CATCH que se encuentra dentro del bloque.

TRY.

SENTENCIA_X.

CATCH cx_exc_1 INTO ref_exc_1.

Page 15: Tutorial ABAP Objects

CATCH cx_exc_2 INTO ref_exc_2.

CLEANUP.

ENDTRY.

“SENTENCIA_X” puede ser una subrutina, un modulo de función, el método de un objeto o algo que pueda lanzar una o más excepciones. Cada “cx_exc_i” es una clase excepción que puede ser lanzada dentro de “SENTENCIA_X”. “ref_exc_i” es una instancia de la clase “cx_exc_i” o de alguna. Lo que se encuentra dentro del bloque CLEANUP se produce cuando el sistema no encuentra un manejador para la excepción que fue levantada. Si SENTENCIA_X levanta la excepción cx_exc_3 y no existe un CATCH para la misma, se ejecutará las instrucciones que se encuentren en el bloque CLEANUP.

Estos conceptos definen las generalidades de la implementación del paradigma orientado a objetos en el mundo SAP a través de ABAP Object. En el próximo tip de la serie de tutoriales, abordaremos un ejemplo concreto.

Tutorial ABAP Objects: Parte 2inShare9

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 Objectsconceptualmente 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

Page 16: Tutorial ABAP Objects

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 einterfaz que serán utilizados para este ejemplo:

Creación y definición de la Interfaz ZACCIONLa 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.

Page 17: Tutorial ABAP Objects

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 seGuarda y Activa.

Creación, definición e implementación de la superclaseZ_ANIMALLa creación de la superclase Z_ANIMAL será necesaria para reflejar los conceptos de Herencia yPolimorfismo. Se van a definir atributos y crear e implementar métodos que

Page 18: Tutorial ABAP Objects

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.

Page 19: Tutorial ABAP Objects

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étodoCONSTRUCTOR 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

Page 20: Tutorial ABAP Objects

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

Page 21: Tutorial ABAP Objects

métodos.

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

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.

Page 22: Tutorial ABAP Objects

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 ZACCIONcreada anteriormente a la misma. Para ello, ir a la solapa Interfaces y escribir el nombre. LuegoGuardar 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 elmétodo BEBER, luego presionar el botón Parameters y definir el parámetro de entradaI_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

Page 23: Tutorial ABAP Objects

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 laherencia 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.

Page 24: Tutorial ABAP Objects

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étodosMOSTRAR_CARACTERISTICAS y CONSTRUCTOR. Seguir los pasos 1) y 2) de

Page 25: Tutorial ABAP Objects

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:

Page 26: Tutorial ABAP Objects

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'.

Page 27: Tutorial ABAP Objects

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):

Page 28: Tutorial ABAP Objects

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:

Page 29: Tutorial ABAP Objects

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

Page 30: Tutorial ABAP Objects

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,

Page 31: Tutorial ABAP Objects

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

Page 32: Tutorial ABAP Objects

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( ).

Page 33: Tutorial ABAP Objects

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:

Page 34: Tutorial ABAP Objects