Ocultamiento de miembros de una clase

Ocultamiento de miembros de una clase

===

Ocultamiento de miembros de una clase

Esta técnica consiste en crear dentro de una clase derivada, miembros con el mismo nombre (y firma, en el caso de métodos) que los existentes en la clase base, pero ocultando el acceso a los miembros de la clase base para los objetos instanciados de la subclase. Utilizaremos la palabra clave Shadows, en la declaración de aquellos miembros a esconder.

Cuando aplicamos el ocultamiento sobre una subclase que tiene métodos sobrecargados en la clase base, dichos métodos sobrecargados quedarán inaccesibles para la clase derivada. Como ejemplo, en el Código fuente 256, la clase Empleado implementa dos versiones sobrecargadas del método Sueldo( ),

Programación con Visual Basic .NET © Grupo EIDOS

mientras que la clase hija Administrativo también tiene el método Sueldo( ), pero al declararse con Shadows, impide que los objetos de tipo Administrativo ejecuten los métodos Sueldo( ) de la clase Empleado.

Module Module1 Sub Main() Dim loAdmin As New Administrativo() Dim ldbImporte As Double Dim lsFecha As String loAdmin.Salario = 925.86 ldbImporte = loAdmin.Sueldo(80, "Viajes")

' los siguientes métodos están ocultos ' desde este objeto y se produce un error al llamarlos loAdmin.Sueldo() lsFecha = loAdmin.Sueldo(5)

End Sub

End Module

Public Class Empleado Private mdbSalario As Double

Public Property Salario() As Double Get Return mdbSalario End Get Set(ByVal Value As Double)

mdbSalario = Value End Set End Property

' métodos sobrecargados Public Overloads Sub Sueldo()

' aquí mostramos en consola el importe del sueldo formateado Console.WriteLine("El sueldo es {0}", Format(Me.Salario, "#,#.##")) Console.ReadLine()

End Sub

Public Overloads Function Sueldo(ByVal liDia As Integer) As String ' aquí mostramos la fecha del mes actual ' en la que se realizará la transferencia ' del sueldo al banco del empleado Dim ldtFechaActual As Date Dim lsFechaCobro As String ldtFechaActual = Now()

lsFechaCobro = CStr(liDia) & "/" & _ CStr(Month(ldtFechaActual)) & "/" & _ CStr(Year(ldtFechaActual))

Return lsFechaCobro End Function End Class

Public Class Administrativo Inherits Empleado

' este método ensombrece/oculta a los sobrecargados ' de la clase base Empleado Public Shadows Function Sueldo(ByVal ldbImporteIncentivo As Double, _

ByVal lsTipoIncentivo As String) As Double ' aquí calculamos la cantidad de incentivo ' que se añadirá al sueldo del empleado,

© Grupo EIDOS 19. Constructores y herencia

' en función del tipo de incentivo Dim ldbIncentivo As Double

' según el tipo de incentivo, ' se descuenta un importe ' de la cantidad del incentivo Select Case lsTipoIncentivo

Case "Viajes" ldbIncentivo = ldbImporteIncentivo - 30 Case "Extras" ldbIncentivo = ldbImporteIncentivo - 15 End Select

Return ldbIncentivo End Function End Class

Código fuente 256

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 257.

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 257

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 258 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

Programación con Visual Basic .NET © Grupo EIDOS

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 258

La Tabla 26 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.

Si la referencia de la variable ...y el tipo de objeto es de la ...el método ejecutado será de es de la clase...

clase...

la clase

Base Base Base Base Derivada Base Derivada Derivada Derivada

Tabla 26. Método ejecutado mediante enlace tardío bajo sobre-escritura, aplicando ocultamiento.

© Grupo EIDOS 19. Constructores y herencia