Herencia y sobre-escritura de métodos

Herencia y sobre-escritura de métodos

===

Herencia y sobre-escritura de métodos

Esta técnica consiste en la capacidad de crear, en una clase derivada, un método que altere parcial o totalmente, la implementación ya existente de dicho método en la clase base. Una de las diferencias existentes con la sobrecarga de métodos, estriba en que al sobrescribir, el método en la subclase puede tener el mismo nombre y lista de parámetros que el ya existente en la clase padre. Podemos sobrescribir tanto métodos como propiedades.

Para indicar en la clase base que un método podrá ser sobrescrito en una subclase, debemos declarar dicho método utilizando la palabra clave Overridable. Posteriormente, cuando en una clase derivada queramos rescribir el método de la clase base, lo declararemos empleando la palabra clave Overrides. Podemos deducir por lo tanto, que la reescritura de métodos es un proceso que se debe realizar con el consentimiento previo de la clase base.

© Grupo EIDOS 19. Constructores y herencia

El Código fuente 251 muestra un ejemplo del uso de este tipo de métodos. En él creamos las ya conocidas clase base Empleado y subclase Administrativo, y en ambas escribimos el método VerDatos( ), con la particularidad de que en la clase hija, cambiamos totalmente su implementación.

Module Module1 Sub Main() Dim loEmp As New Empleado() loEmp.piID = 50 loEmp.Nombre = "juan casas" loEmp.VerDatos()

Console.WriteLine()

Dim loAdmin As New Administrativo() loAdmin.piID = 129 loAdmin.Nombre = "elena redondo" loAdmin.VerDatos()

Console.ReadLine() End Sub End Module

Public Class Empleado Public piID As Integer Private msNombre As String

Public Property Nombre() As String Get Return msNombre End Get Set(ByVal Value As String)

msNombre = Value End Set End Property

' marcamos el método como rescribible con Overridable Public Overridable Sub VerDatos()

Console.WriteLine("Datos del empleado: {0}-{1}", _ Me.piID, Me.Nombre) End Sub End Class

Public Class Administrativo : Inherits Empleado ' rescribimos este método totalmente usando Overrides Public Overrides Sub VerDatos()

Console.WriteLine("Datos del empleado") Console.WriteLine("==================") Console.WriteLine("Código: {0}", Me.piID) Console.WriteLine("Nombre: {0}", UCase(Me.Nombre))

End Sub End Class

Código fuente 251

Pero, ¿qué sucede si queremos utilizar la implementación del método base en la clase derivada?, pues sólo necesitamos llamar al método de la clase padre usando la palabra clave MyBase.

Para ilustrar esta situación, añadiremos a la clase Empleado la propiedad Salario, y un método para calcularlo, de modo que todos los empleados tengan inicialmente el mismo salario, sin embargo, los administrativos necesitan un pequeño incremento. Para no tener que volver a realizar el cálculo en la

Programación con Visual Basic .NET © Grupo EIDOS

clase Administrativo, vamos a aprovechar el cálculo que ya se realiza en la clase padre, añadiendo sólo las operaciones particulares que necesitemos. Veámoslo en el Código fuente 252.

Module Module1 Sub Main() Dim loEmp As New Empleado() loEmp.piID = 50 loEmp.Nombre = "juan casas" loEmp.VerDatos() loEmp.CalcularSalario() Console.WriteLine("Salario {0}", loEmp.Salario)

Console.WriteLine()

Dim loAdmin As New Administrativo() loAdmin.piID = 129 loAdmin.Nombre = "elena redondo" loAdmin.VerDatos() loAdmin.CalcularSalario() Console.WriteLine("Salario {0}", loAdmin.Salario)

Console.ReadLine() End Sub End Module

Public Class Empleado '...... '...... Public miSalario As Integer

Public Property Salario() As Integer Get Return miSalario End Get Set(ByVal Value As Integer)

miSalario = Value End Set End Property

Public Overridable Sub CalcularSalario() Me.Salario = 800 End Sub '...... '......

End Class

Public Class Administrativo : Inherits Empleado '...... '...... Public Overrides Sub CalcularSalario()

' utilizamos el método de la clase base MyBase.CalcularSalario() Me.Salario += 50

End Sub End Class

Código fuente 252

Debido a cuestiones de diseño, en algunas ocasiones precisaremos que al mismo tiempo que sobrescribimos un miembro dentro de una clase heredada, dicho miembro no pueda ser sobrescrito por las clases que hereden de esta. En estas situaciones, al declarar el miembro, usaremos la palabra clave NotOverridable.

© Grupo EIDOS 19. Constructores y herencia

Volvamos pues, al ejemplo de la clase Administrativo, en el que sobrescribíamos el método VerDatos(). Si cambiamos la declaración de dicho método por la mostrada en el Código fuente 253, una tercera clase Directivo, que heredase de Administrativo, no podría sobrescribir el mencionado método.

Public Class Administrativo : Inherits Empleado ' rescribimos este método totalmente usando Overrides ' e impedimos que pueda ser rescrito por clases ' derivadas de esta Public NotOverridable Overrides Sub VerDatos()

Console.WriteLine("Datos del empleado") Console.WriteLine("==================") Console.WriteLine("Código: {0}", Me.piID) Console.WriteLine("Nombre: {0}", UCase(Me.Nombre))

End Sub End Class

Public Class Directivo : Inherits Administrativo ' se produce un error, no se puede sobrescribir este método ' ya que la clase Administrativo lo impide con NotOverridable Public Overrides Sub VerDatos()

'..... '.....

End Sub End Class

Código fuente 253

No podemos utilizar NotOverridable en métodos de una clase base, ya que la misión de este modificador es impedir la sobre-escritura de miembros en clases derivadas, pero desde una clase que a su vez también ha sido derivada desde la clase base. Si no queremos, en una clase base, que un método pueda ser sobrescrito, simplemente no utilizamos en su declaración la palabra clave Overridable.