SAP ABAP - Clases
Una clase se usa para especificar la forma de un objeto y combina la representación de datos y métodos para manipular esos datos en un paquete ordenado. Los datos y funciones dentro de una clase se llamanmembers of the class.
Definición e implementación de clases
Cuando define una clase, define un plano para un tipo de datos. En realidad, esto no define ningún dato, pero sí define qué significa el nombre de la clase, en qué consistirá un objeto de la clase y qué operaciones se pueden realizar en dicho objeto. Es decir, define las características abstractas de un objeto, como atributos, campos y propiedades.
La siguiente sintaxis muestra cómo definir una clase:
CLASS <class_name> DEFINITION.
..........
..........
ENDCLASS.
Una definición de clase comienza con la palabra clave CLASS seguida del nombre de la clase, DEFINITION y el cuerpo de la clase. La definición de una clase puede contener varios componentes de la clase, como atributos, métodos y eventos. Cuando declaramos un método en la declaración de clase, la implementación del método debe incluirse en la implementación de la clase. La siguiente sintaxis muestra cómo implementar una clase:
CLASS <class_name> IMPLEMENTATION.
...........
..........
ENDCLASS.
Note- La implementación de una clase contiene la implementación de todos sus métodos. En los objetos ABAP, la estructura de una clase contiene componentes como atributos, métodos, eventos, tipos y constantes.
Atributos
Los atributos son campos de datos de una clase que pueden tener cualquier tipo de datos como C, I, F y N. Se declaran en la declaración de la clase. Estos atributos se pueden dividir en 2 categorías: instancia y atributos estáticos. Uninstance attributedefine el estado específico de la instancia de un objeto. Los estados son diferentes para diferentes objetos. Un atributo de instancia se declara mediante la instrucción DATA.
Static attributesdefinir un estado común de una clase que sea compartido por todas las instancias de la clase. Es decir, si cambia un atributo estático en un objeto de una clase, el cambio también es visible para todos los demás objetos de la clase. Un atributo estático se declara mediante la instrucción CLASS-DATA.
Métodos
Un método es una función o procedimiento que representa el comportamiento de un objeto en la clase. Los métodos de la clase pueden acceder a cualquier atributo de la clase. La definición de un método también puede contener parámetros, por lo que puede proporcionar los valores a estos parámetros cuando se llaman métodos. La definición de un método se declara en la declaración de clase y se implementa en la parte de implementación de una clase. Las sentencias METHOD y ENDMETHOD se utilizan para definir la parte de implementación de un método. La siguiente sintaxis muestra cómo implementar un método:
METHOD <m_name>.
..........
..........
ENDMETHOD.
En esta sintaxis, <m_name> representa el nombre de un método. Note - Puede llamar a un método utilizando la instrucción CALL METHOD.
Acceder a atributos y métodos
Los componentes de clase se pueden definir en secciones de visibilidad pública, privada o protegida que controlan cómo se puede acceder a estos componentes. La sección de visibilidad privada se usa para denegar el acceso a componentes desde fuera de la clase. Solo se puede acceder a dichos componentes desde dentro de la clase, como un método.
Se puede acceder a los componentes definidos en la sección de visibilidad pública desde cualquier contexto. Por defecto, todos los miembros de una clase serían privados. Prácticamente, definimos datos en la sección privada y métodos relacionados en la sección pública para que puedan ser llamados desde fuera de la clase como se muestra en el siguiente programa.
Los atributos y métodos declarados en la sección Pública de una clase pueden ser accedidos por esa clase y cualquier otra clase, subclase del programa.
Cuando los atributos y métodos se declaran en la sección Protegido de una clase, solo esa clase y subclases (clases derivadas) pueden acceder a ellos.
Cuando los atributos y métodos se declaran en la sección Privada de una clase, solo esa clase puede acceder a ellos y ninguna otra clase.
Ejemplo
Report ZAccess1.
CLASS class1 Definition.
PUBLIC Section.
Data: text1 Type char25 Value 'Public Data'.
Methods meth1.
PROTECTED Section.
Data: text2 Type char25 Value 'Protected Data'.
PRIVATE Section.
Data: text3 Type char25 Value 'Private Data'.
ENDCLASS.
CLASS class1 Implementation.
Method meth1.
Write: / 'Public Method:',
/ text1,
/ text2,
/ text3.
Skip.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Data: Objectx Type Ref To class1.
Create Object: Objectx.
CALL Method: Objectx→meth1.
Write: / Objectx→text1.
El código anterior produce la siguiente salida:
Public Method:
Public Data
Protected Data
Private Data
Public Data
Atributos estáticos
Un atributo estático se declara con la declaración CLASS-DATA. Todos los objetos o instancias pueden usar el atributo estático de la clase. Se accede directamente a los atributos estáticos con la ayuda de un nombre de clase como class_name⇒name_1 = 'Some Text'.
Ejemplo
A continuación se muestra un programa en el que queremos imprimir un texto con el número de línea de 4 a 8 veces. Definimos una clase class1 y en la sección pública declaramos CLASS-DATA (atributo estático) y un método. Después de implementar la clase y el método, accedemos directamente al atributo estático en el evento Start-Of-Selection. Luego, simplemente creamos la instancia de la clase y llamamos al método.
Report ZStatic1.
CLASS class1 Definition.
PUBLIC Section.
CLASS-DATA: name1 Type char45,
data1 Type I.
Methods: meth1.
ENDCLASS.
CLASS class1 Implementation.
Method meth1.
Do 4 Times.
data1 = 1 + data1.
Write: / data1, name1.
EndDo.
Skip.
EndMethod.
ENDCLASS.
Start-Of-Selection.
class1⇒name1 = 'ABAP Object Oriented Programming'.
class1⇒data1 = 0.
Data: Object1 Type Ref To class1,
Object2 Type Ref To class1.
Create Object: Object1, Object2.
CALL Method: Object1→meth1,
Object2→meth1.
El código anterior produce la siguiente salida:
Constructores
Los constructores son métodos especiales que se llaman automáticamente, ya sea al crear un objeto o al acceder a los componentes de una clase. El constructor se activa cada vez que se crea un objeto, pero necesitamos llamar a un método para activar el método general. En el siguiente ejemplo, hemos declarado dos métodos públicos method1 y constructor. Ambos métodos tienen operaciones diferentes. Al crear un objeto de la clase, el método constructor desencadena su operación.
Ejemplo
Report ZConstructor1.
CLASS class1 Definition.
PUBLIC Section.
Methods: method1, constructor.
ENDCLASS.
CLASS class1 Implementation.
Method method1.
Write: / 'This is Method1'.
EndMethod.
Method constructor.
Write: / 'Constructor Triggered'.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Data Object1 Type Ref To class1.
Create Object Object1.
El código anterior produce la siguiente salida:
Constructor Triggered
Operador ME en métodos
Cuando declaras una variable de cualquier tipo en la sección pública de una clase, puedes usarla en cualquier otra implementación. Una variable se puede declarar con un valor inicial en la sección pública. Podemos declarar la variable nuevamente dentro de un método con un valor diferente. Cuando escribimos la variable dentro del método, el sistema imprimirá el valor cambiado. Para reflejar el valor anterior de la variable, tenemos que usar el operador 'ME'.
En este programa, hemos declarado una variable pública text1 e iniciada con un valor. Hemos declarado la misma variable nuevamente, pero instanciada con un valor diferente. Dentro del método, estamos escribiendo esa variable con el operador 'ME' para obtener el valor iniciado previamente. Obtenemos el valor cambiado declarando directamente.
Ejemplo
Report ZMEOperator1.
CLASS class1 Definition.
PUBLIC Section.
Data text1 Type char25 Value 'This is CLASS Attribute'.
Methods method1.
ENDCLASS.
CLASS class1 Implementation.
Method method1.
Data text1 Type char25 Value 'This is METHOD Attribute'.
Write: / ME→text1,
/ text1.
ENDMethod.
ENDCLASS.
Start-Of-Selection.
Data objectx Type Ref To class1.
Create Object objectx.
CALL Method objectx→method1.
El código anterior produce la siguiente salida:
This is CLASS Attribute
This is METHOD Attribute