Comportamiento de las palabras clave Me, MyClass y MyBase ante la sobre-escritura de métodos

Comportamiento de las palabras clave Me, MyClass y MyBase ante la sobre-escritura de métodos

===

Comportamiento de las palabras clave Me, MyClass y MyBase ante la sobre-escritura de métodos

En anteriores apartados, explicamos que las palabras clave Me y MyClass, sirven para llamar a los miembros de una clase desde el código de la propia clase; mientras que con la palabra clave MyBase podíamos llamar a los miembros de la clase base desde una subclase.

Sin embargo, al efectuar sobre-escritura de miembros, los resultados utilizando estas palabras clave pueden no ser los inicialmente esperados, debido al tipo de enlace que emplean. MyBase y MyClass utilizan enlace temprano para realizar la llamada, mientras que Me usa enlace tardío.

Tomando como ejemplo la clase base Empleado y sus clases derivadas Administrativo y Directivo, creamos el método sobrescrito VerDatos( ) en cada una de estas clases; cada versión tendrá una implementación diferente que nos permita diferenciar la clase que lo ejecuta.

A continuación, en la clase Administrativo escribimos el método DameInformacion( ), desde el que hacemos llamadas a VerDatos( ) utilizando MyBase, MyClass, Me, y una última llamada especificando solamente el nombre del método.

Si instanciamos un objeto de la clase Administrativo, al ejecutar DameInformacion( ) el resultado será el esperado: MyBase llamará a la versión de VerDatos( ) que hay en la clase Empleado, mientras que el resto de llamadas se harán a la implementación de dicho método en la clase Administrativo.

Sin embargo, los efectos no serán tan obvios al instanciar un objeto de la clase Directivo: al ejecutar DameInformacion( ), MyBase llamará a VerDatos( ) de Empleado, MyClass llamará a VerDatos( ) de Administrativo, pero Me realiza una llamada al método que se encuentra en la clase más alejada en la jerarquía, respecto a la clase base, es decir, la clase Directivo; el efecto será el mismo si ponemos el nombre del método sin utilizar Me. Veamos este ejemplo en el Código fuente 259.

Module Module1 Public Sub Main() Dim loDirec As Directivo = New Directivo() loDirec.piID = 980 loDirec.psNombre = "Gema Peral" loDirec.pdtFHAlta = "20/5/2002" loDirec.DameInformacion() Console.Read()

End Sub End Module

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

Public Overridable 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

Public Class Administrativo : Inherits Empleado Public Overrides Sub VerDatos() Console.WriteLine("Datos del empleado") Console.WriteLine("==================")

Programación con Visual Basic .NET © Grupo EIDOS

Console.WriteLine("Identificador: {0}", Me.piID) Console.WriteLine("Nombre: {0}", StrConv(Me.psNombre,

VbStrConv.ProperCase)) Console.WriteLine("Fecha de alta: {0}", Format(Me.pdtFHAlta, "dd/MMM/yy")) Console.WriteLine()

End Sub

Public Sub DameInformacion() ' cuando el objeto en ejecución ' es de la clase derivada Directivo ' los resultados de las llamadas desde ' este método al método VerDatos() son ' los siguientes: MyBase.VerDatos() ' llama a Empleado.VerDatos() - enlace temprano MyClass.VerDatos() ' llama a Administrativo.VerDatos() - enlace temprano Me.VerDatos() ' llama a Directivo.VerDatos() - enlace tardío VerDatos() ' llama a Directivo.VerDatos() - enlace tardío

End Sub End Class

Public Class Directivo : Inherits Administrativo Public Overrides Sub VerDatos()

Console.WriteLine("El empleado {0} comenzó a trabajar en el mes de:", _

Me.psNombre) Console.WriteLine(Format(Me.pdtFHAlta, "MMMM")) Console.WriteLine()

End Sub End Class

Código fuente 259