Clases abstractas o no instanciables

Clases abstractas o no instanciables

Una clase abstracta es aquella que no permite la instanciación directa de objetos a partir de ella, siendo necesario una clase derivada para acceder a sus miembros. Una clase concreta es el tipo de clase que venimos utilizando hasta el momento, desde la cuál, podemos instanciar objetos.

Aunque en una clase abstracta podemos escribir un método constructor, sólo será accesible desde el constructor de la subclase.

Para definir una clase abstracta utilizaremos la palabra clave MustInherit en el momento de su declaración, como muestra el Código fuente 262.

Public MustInherit Class Empleado

Código fuente 262

Dentro de una clase abstracta podemos implementar propiedades y métodos, en la forma que hemos visto hasta el momento. Adicionalmente, podemos obligar a que determinados miembros sean sobrescritos por la clase heredada; son los denominados miembros abstractos, y se declaran usando la palabra clave MustOverride, como vemos en el Código fuente 263.

© Grupo EIDOS 19. Constructores y herencia

Module Module1 Public Sub Main() Dim loAdmin As New Administrativo() loAdmin.piID = 789 loAdmin.psNombre = "Pedro Pinares" Console.WriteLine("Nombre en mayúsculas del administrativo: {0}", _

loAdmin.NombreMay) loAdmin.pdtFHAlta = "8/10/01" loAdmin.MesesActivo() Console.Read()

End Sub End Module

' clase abstracta, ' no podemos crear objetos Empleado Public MustInherit Class Empleado

Public piID As Integer Public psNombre As String Public pdtFHAlta As Date

Public ReadOnly Property NombreMay() As String Get Return UCase(Me.psNombre) End Get End Property

' método abstracto; ' este método debe ser sobrescrito ' por la clase derivada Public MustOverride Sub MesesActivo()

Public Sub VerDatos() Console.WriteLine("Información sobre el empleado." & _ " ID:{0} - Nombre:{1} - Fecha de alta:{2}", _ Me.piID, Me.psNombre, Me.pdtFHAlta)

Console.WriteLine() End Sub End Class

' desde esta clase tendremos acceso ' a los miembros de la clase Empleado Public Class Administrativo

Inherits Empleado

' en esta clase sobrescribimos este método ' declarado como abstracto en la clase abstracta Public Overrides Sub MesesActivo()

Console.WriteLine("Entró en el mes de {0}", _ Format(Me.pdtFHAlta, "MMMM")) Console.WriteLine("El número de meses que lleva es: {0}", _ DateDiff(DateInterval.Month, Me.pdtFHAlta, Now)) End Sub

Public Overrides Sub VerDatos() '.... '.... End Sub End Class

Código fuente 263

Debemos tener en cuenta que los miembros abstractos sólo tienen sentido si son declarados en clases abstractas. Por tal motivo, sólo podremos crear métodos con MustOverride en clases que hayan sido definidas como MustInherit.

Programación con Visual Basic .NET © Grupo EIDOS

En lo que respecta al polimorfismo conseguido a través de clases abstractas, podemos crear un procedimiento que reciba como parámetro tipificado como clase abstracta, de forma que en función del objeto pasado, y que debe ser de un tipo derivado de la clase abstracta, el comportamiento será diferente en cada caso. Veámoslo en el Código fuente 264.

Module Module1 Public Sub Main() '.... End Sub

' el objeto que reciba este procedimiento será ' de cualquiera de las clases que hereden de ' Empleado y ejecutará la implementación del método ' VerDatos() que tenga dicho objeto Public Sub MostrarInformacion(ByVal loEmple As Empleado)

loEmple.VerDatos() End Sub End Module

Código fuente 264.

Elementos compartidos e interfaces