SAP ABAP - Herencia

Uno de los conceptos más importantes en la programación orientada a objetos es el de herencia. La herencia nos permite definir una clase en términos de otra clase, lo que facilita la creación y el mantenimiento de una aplicación. Esto también brinda la oportunidad de reutilizar la funcionalidad del código y un tiempo de implementación rápido.

Al crear una clase, en lugar de escribir métodos y miembros de datos completamente nuevos, el programador puede designar que la nueva clase herede los miembros de una clase existente. Esta clase existente se llamabase class o super class, y la nueva clase se conoce como derived class o sub class.

  • Un objeto de una clase puede adquirir las propiedades de otra clase.

  • La clase derivada hereda los datos y métodos de una superclase. Sin embargo, pueden sobrescribir métodos y también agregar nuevos métodos.

  • La principal ventaja de la herencia es la reutilización.

La relación de herencia se especifica usando la adición 'HEREDANDO DE' a la declaración de definición de clase.

A continuación se muestra la sintaxis:

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

Ejemplo

Report ZINHERITAN_1. 
CLASS Parent Definition. 
PUBLIC Section. 
Data: w_public(25) Value 'This is public data'. 
Methods: ParentM. 
ENDCLASS. 

CLASS Child Definition Inheriting From Parent. 
PUBLIC Section. 
Methods: ChildM. 
ENDCLASS. 

CLASS Parent Implementation. 
Method ParentM. 
Write /: w_public. 
EndMethod. ENDCLASS. 

CLASS Child Implementation. 
Method ChildM. 
Skip. 
Write /: 'Method in child class', w_public.
EndMethod. 
ENDCLASS. 

Start-of-selection. 
Data: Parent Type Ref To Parent, 
Child Type Ref To Child. 
Create Object: Parent, Child. 
Call Method: Parent→ParentM, 
child→ChildM.

El código anterior produce la siguiente salida:

This is public data 
Method in child class 
This is public data

Control de acceso y herencia

Una clase derivada puede acceder a todos los miembros no privados de su clase base. Por lo tanto, los miembros de superclase que no deberían ser accesibles para las funciones miembro de las subclases deberían declararse privados en la superclase. Podemos resumir los diferentes tipos de acceso según quién pueda acceder a ellos de la siguiente manera:

Acceso Público Protegido Privado
Misma calss si si si
Clase derivada si si No
Fuera de clase si No No

Cuando se deriva una clase de una superclase, se puede heredar mediante herencia pública, protegida o privada. El tipo de herencia lo especifica el especificador de acceso como se explicó anteriormente. Apenas usamos herencia protegida o privada, pero la herencia pública se usa comúnmente. Las siguientes reglas se aplican al utilizar diferentes tipos de herencia.

  • Public Inheritance- Cuando se deriva una clase de una superclase pública, los miembros públicos de la superclase se convierten en miembros públicos de la subclase y los miembros protegidos de la superclase se convierten en miembros protegidos de la subclase. Los miembros privados de la superclase nunca son accesibles directamente desde una subclase, pero se puede acceder a ellos mediante llamadas al público y a los miembros protegidos de la superclase.

  • Protected Inheritance - Al derivar de una superclase protegida, los miembros públicos y protegidos de la superclase se convierten en miembros protegidos de la subclase.

  • Private Inheritance - Cuando se deriva de una superclase privada, los miembros públicos y protegidos de la superclase se convierten en miembros privados de la subclase.

Redefiniendo métodos en subclase

Los métodos de la superclase se pueden volver a implementar en la subclase. Pocas reglas para redefinir métodos -

  • La declaración de redefinición del método heredado debe estar en la misma sección que la definición del método original.

  • Si redefine un método, no es necesario que vuelva a ingresar a su interfaz en la subclase, sino solo el nombre del método.

  • Dentro del método redefinido, puede acceder a los componentes de la superclase directa utilizando la superreferencia.

  • La super pseudo referencia solo se puede utilizar en métodos redefinidos.

Ejemplo

Report Zinheri_Redefine. 
CLASS super_class Definition. 
Public Section. 
Methods: Addition1 importing g_a TYPE I
                             g_b TYPE I
		   exporting g_c TYPE I.
ENDCLASS. 

CLASS super_class Implementation. 
Method Addition1. 
g_c = g_a + g_b. 
EndMethod. 
ENDCLASS. 

CLASS sub_class Definition Inheriting From super_class. 
Public Section. 
METHODS: Addition1 Redefinition. 
ENDCLASS. 

CLASS sub_class Implementation. 
Method Addition1. 
g_c = g_a + g_b + 10. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Parameters: P_a Type I, P_b TYPE I. 
Data: H_Addition1 TYPE I. 
Data: H_Sub TYPE I. 
Data: Ref1 TYPE Ref TO sub_class. 
Create Object Ref1. 
Call Method Ref1→Addition1 exporting g_a = P_a 
                                     g_b = P_b
		           Importing g_c = H_Addition1. 
Write:/ H_Addition1.

Después de ejecutar F8, si ingresamos los valores 9 y 10, el código anterior produce la siguiente salida:

Redefinition Demo 
29