¿Cómo se redefinen los métodos?
Todas las subclases contienen los componentes de todas las clases existentes entre ellas mismas y el nodo raíz del árbol de herencia.
La visibilidad de un componente no puede ser cambiada nunca. En cambio, se puede usar la cláusula REDEFINITION en la sentencia METHODS para redefinir un método público o protegido dependiente de instancia en una subclase y hacer que realice una función más especializada.
Cuando se redefine un método no se puede cambiar su interface, el método mantiene el mismo nombre y la misma interface de parámetros, pero tiene una nueva implementación.
La declaración y la implementación de un método en una superclase no se ven afectados cuando se redefine un método en una subclase.
La implementación de la redefinición en la subclase ‘oculta’ la implementación original en la superclase.
Cualquier referencia que apunte a un objeto de la subclase usa el método redefinido, incluso si la referencia fue definida con referencia a la superclase. Esto se aplica particularmente a la referencia a sí mismo me->.
Si por ejemplo un método M1 de una superclase contiene una llamada CALL METHOD [ME->]M2 y M2 está redefinido en una subclase, la llamada a M1 desde una instancia de la superclase hará que el método original M2 sea llamado, mientras que la llamada a M1 desde una instancia de la subclase hará que el método llamado sea el redefinido M2 (llaman a ‘distintos’ métodos, aunque tengan el mismo nombre).
Dentro de un método redefinido se puede usar la referencia SUPER-> para acceder al método ‘oculto’. Esto permite usar la funcionalidad existente en el método de la superclase sin tener que codificarla de nuevo en la subclase.
En este artículo vamos a utilizar la redefinición de métodos.
Vamos a crear una clase PEDIDO con un método ADD_POSICION que será redefinido en la clase PEDIDO_DISCOUNT.
Seguimos ampliando el programa y creamos la tercera clase llamada PEDIDO_SUPER_DISCOUNT que hereda de la clase PEDIDO_DISCOUNT y redefine el mismo método ADD_POSICION aplicando un 20% de descuento en el campo precio neto (NETWR). Creamos una instancia de la clase PEDIDO_SUPER_DISCOUNT y llamamos al método ADD_POSICION.