Herencia y métodos constructores

Herencia y métodos constructores

Podemos crear una clase base que implemente un constructor y una subclase sin él. En esta situación, cuando instanciemos un objeto de la subclase, se llamará implícitamente al constructor de la clase base para ejecutar el código de inicialización. También es posible crear el constructor sólo en la clase derivada.

Si ambas clases disponen de un constructor, en primer lugar se ejecutará el constructor de la clase base y después el de la clase derivada. Realmente, el primer constructor ejecutado corresponde a la clase Object, y sucesivamente, se irán ejecutando todos los constructores de la jerarquía de clases hasta llegar a la clase que originó la llamada.

El problema sobreviene cuando en la clase base creamos un constructor parametrizado, ya que ello obliga a sus clases derivadas a crear también un método constructor dentro del cuál se haga una llamada al constructor de la clase base. Para llamar explícitamente a un método de la clase base desde una subclase utilizaremos la palabra clave MyBase, que contiene una referencia hacia la clase padre.

Veamos un ejemplo, en el Código fuente 260 se crea una clase padre Empleado y la subclase Administrativo. Puesto que Empleado dispone de un constructor parametrizado, en Administrativo debemos crear también un constructor, y dentro de él llamar en primer lugar al constructor base.

Public Class Empleado Public piID As Integer Public psNombre As String Public piSalario As Integer

' constructor parametrizado

© Grupo EIDOS 19. Constructores y herencia

Public Sub New(ByVal lsNombre As String) Me.psNombre = lsNombre End Sub End Class

Public Class Administrativo Inherits Empleado

' constructor normal Public Sub New()

' llamada al constructor ' de la clase base MyBase.New("Juan") Me.piSalario = 100

End Sub End Class

Código fuente 260

Podemos no obstante, evitar la obligación de escribir un constructor en la clase derivada, si en la clase padre creamos un constructor sin parámetros. Como ya sabemos, la sobrecarga de métodos nos permite escribir varios métodos con el mismo nombre y diferente lista de parámetros. Modifiquemos para ello la clase Empleado como muestra el Código fuente 261.

Public Class Empleado Public piID As Integer Public psNombre As String Public piSalario As Integer

' constructor parametrizado Public Sub New(ByVal lsNombre As String)

Me.psNombre = lsNombre End Sub

' constructor sin parámetros Public Sub New()

psNombre = "hola" End Sub End Class

Public Class Administrativo Inherits Empleado

' al disponer en la clase base de ' un constructor normal, ya no hay ' necesidad de crear un constructor ' en esta clase derivada

End Class

Código fuente 261

Finalmente, debemos apuntar dos reglas que debe cumplir todo método constructor de una subclase que llame al constructor de su clase base: en primer lugar, el constructor base debe ser llamado en la primera línea del constructor derivado; en segundo lugar, el constructor base sólo puede ser llamado una vez desde el constructor derivado.

Programación con Visual Basic .NET © Grupo EIDOS

Clases selladas o no heredables

Toda clase que declaremos en nuestro código es heredable por defecto; esto supone un elevado grado

de responsabilidad, en el caso de que diseñemos una clase pensando en que pueda ser utilizada por otros programadores que hereden de ella. Si en un determinado momento, necesitamos hacer cambios en nuestra clase, dichos cambios afectarán a las clases derivadas que hayan sido creadas.

Por dicho motivo, si no queremos que nuestra clase pueda ser heredada por otras, debemos declararla

de forma que no permita herencia; a este tipo de clase se le denomina clase no heredable o sellada (sealed).

Para definir una clase no heredable, debemos utilizar la palabra clave NotInheritable en el momento de su declaración.

En la Figura 201 hemos creado la clase Fichero como no NotInheritable, por ello, cuando a continuación declaramos la clase FiTexto e intentamos que herede de Fichero, se mostrará un mensaje

de error en el editor de código, indicándonos que no es posible establecer esta relación de herencia puesto que Fichero es una clase sellada.

Figura 201. No es posible heredar de una clase NotInheritable.