Herencia – SAP ABAP

Uno de los conceptos más importantes de la programación orientada a objetos es el de la 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. También ofrece la oportunidad de reutilizar la funcionalidad del código y acelerar el tiempo de implementación.

Al crear una clase, en lugar de escribir miembros de datos y métodos completamente nuevos, el programador puede designar que la nueva clase herede los miembros de una clase existente. Esta clase existente se denomina clase base o superclase, y la nueva clase se denomina clase derivada o subclase.
Un objeto de una clase puede adquirir las propiedades de otra clase.
La clase derivada hereda los datos y métodos de la superclase. Sin embargo, pueden sobrescribir métodos y también añadir otros nuevos.
La principal ventaja de la herencia es la reutilización.
La relación de herencia se especifica mediante el añadido ‘INHERITING FROM’ a la declaración de definición de la clase.

La sintaxis es la siguiente:

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.

The above code produces the following output −

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 la superclase que no deben ser accesibles a las funciones miembro de las subclases deben ser declarados privados en la superclase. Podemos resumir los diferentes tipos de acceso en función de quién puede acceder a ellos de la siguiente manera

AccessPublicProtectedPrivate
Same calssYesYesYes
Derived classYesYesNo
Outside classYesNoNo

Cuando se deriva una clase de una superclase, se puede heredar mediante herencia pública, protegida o privada. El tipo de herencia se especifica mediante el especificador de acceso, como se ha explicado anteriormente. Apenas utilizamos la herencia protegida o privada, pero la herencia pública es de uso común. Las siguientes reglas se aplican cuando se utilizan diferentes tipos de herencia.


Herencia pública – 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 a los miembros públicos y protegidos de la superclase.


Herencia protegida – Cuando se deriva de una superclase protegida, los miembros públicos y protegidos de la superclase se convierten en miembros protegidos de la subclase.


Herencia privada – Cuando se deriva de una superclase privada, los miembros públicos y protegidos de la superclase se convierten en miembros privados de la subclase.

Redefinición de métodos en la subclase

Los métodos de la superclase pueden ser reimplementados en la subclase. Algunas reglas de redefinición de 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 se redefine un método, no es necesario volver a introducir su interfaz en la subclase, sino sólo el nombre del método.
Dentro del método redefinido, puede acceder a los componentes de la superclase directa utilizando la superreferencia.
La pseudo referencia super sólo puede utilizarse en los 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 introducimos los valores 9 y 10, el código anterior produce la siguiente salida:

Saludos, más info en: https://setevalapinsap.com