Buscador

Ocultamiento de miembros de una clase - II

Cuando en una clase hija creamos un método con el mismo nombre y parámetros que en la clase padre, el compilador realiza un ocultamiento implícito, aunque genera un aviso, recomendando que declaremos el método de la clase hija con Shadows. Veamos el Código fuente 274.

Public Class Empleado
'....
Public Sub Sueldo()
' aquí mostramos en consola el importe del sueldo formateado
Console.WriteLine("El sueldo es {0}", Format(Me.Salario, "#,#.##"))
Console.ReadLine()
End Sub
'....
End Class
Public Class Administrativo
'....
' si aquí no utilizáramos Shadows, el entorno
' marcaría este método con un aviso
Public Shadows Sub Sueldo()
' aquí incrementamos el valor actual de la propiedad Salario
Me.Salario += 250
End Sub
'....
End Class
Código fuente 274
Por otra parte, si aplicamos el ocultamiento en la sobre-escritura, el comportamiento del objeto se verá profundamente afectado. La mejor situación para comprobar este particular consiste en declarar una variable de la clase base y asignarle un objeto de una clase heredada. A pesar de que, como hemos comentado anteriormente, la sobre-escritura se basa en el enlace tardío, si ocultamos un miembro de la clase derivada, forzaremos al objeto a dirigirse a la versión de dicho miembro existente en la clase padre. 
El ejemplo del Código fuente 275 muestra este caso. En él creamos nuestras dos clases habituales, Empleado y Administrativo, relacionadas mediante herencia, con un método sobrescrito en ambas, que tiene la particularidad de que la versión existente en la clase derivada está oculto con Shadows. Esto hará que al instanciar un objeto de la clase hija, y pasárselo a una variable referenciada hacia la clase padre, la llamada al método sea desviada hacia la implementación existente en la clase padre, en lugar de a la clase derivada como sería su comportamiento habitual.

Module Module1
Sub Main()
Dim loPersona As Empleado
loPersona = New Administrativo()
loPersona.psNombre = "Juan"
' estamos utilizando sobre-escritura,
' por lo que el enlace tardío emplea el objeto
' que hay dentro de la variable y no la
' referencia de la variable;
' al estar oculta con Shadows la implementación
' del método MostrarNombre() en la clase Administrativo
' se ejecuta dicho método pero de la clase Empleado
loPersona.MostrarNombre()
Console.ReadLine()
End Sub
End Module
Public Class Empleado
Public psNombre As String
Public pdtFHAlta As Date
Public Overridable Sub MostrarNombre()
Console.WriteLine("El nombre del empleado es {0}", _
Me.psNombre)
End Sub
End Class
Public Class Administrativo : Inherits Empleado
' ocultamos este método
Public Shadows Sub MostrarNombre()
Console.WriteLine("Nombre del empleado")
Console.WriteLine("===================")
Console.WriteLine(UCase(Me.psNombre))
End Sub
End Class
Código fuente 275
La Tabla 24 muestra, al utilizar sobre-escritura y ocultamiento, la clase de la cuál será ejecutado el método, en función de la referencia de la variable y el tipo de objeto.

No hay comentarios:

Publicar un comentario