Diferencias entre sobrecarga y sobre-escritura en base al tipo de enlace

Diferencias entre sobrecarga y sobre-escritura en base al tipo de enlace

===

Diferencias entre sobrecarga y sobre-escritura en base al tipo de enlace

La otra diferencia entre sobrecarga y sobre-escritura consiste en el tipo de enlace que utilizan. Mientras que la sobrecarga se basa en enlace temprano, la sobre-escritura emplea enlace tardío.

El mejor modo de comprobar este punto, consiste en declarar una variable con un tipo perteneciente a una clase base, pero asignándole un objeto correspondiente a una clase heredada.

Por ejemplo, en el caso de la sobrecarga, creamos las ya conocidas clases Empleado y Administrativo, escribiendo el método VerAlta( ), sobrecargado en cada una de ellas.

A continuación declaramos una variable de tipo Empleado, pero instanciamos un objeto de la clase Administrativo y lo asignamos a la variable. Debido a que el enlace temprano se basa en el tipo de la variable y no en el objeto que contiene, el método VerAlta( ) al que podremos acceder será el que se encuentra en la clase Empleado. Veamos el Código fuente 254.

Module Module1 Sub Main()

Programación con Visual Basic .NET © Grupo EIDOS

Dim loPersona As Empleado loPersona = New Administrativo() loPersona.psNombre = "Juan García" loPersona.pdtFHAlta = "15/1/2002" ' como la sobrecarga utiliza enlace temprano, ' se basa en el tipo de la variable y no ' en el objeto que se asigna a esa variable, ' por ello sólo es visible la implementación ' del método que hay en la clase Empleado loPersona.VerAlta() ' si intentamos ejecutar el método VerAlta() ' que recibe una cadena, se producirá el siguiente error: ' "Demasiados argumentos para 'Public Sub VerAlta()'." loPersona.VerAlta("Mes") ' <-- error Console.ReadLine()

End Sub End Module

Public Class Empleado Public psNombre As String Public pdtFHAlta As Date

' mostrar la fecha de alta al completo Public Sub VerAlta()

Console.WriteLine("El empleado {0} se incorporó el {1}", _ Me.psNombre, Me.pdtFHAlta) End Sub End Class

Public Class Administrativo : Inherits Empleado ' mostrar sólo una parte de la fecha de alta ' según el parámetro pasado Public Overloads Sub VerAlta(ByVal lsParteFecha As String)

Dim lsValorFecha As String Select Case lsParteFecha

Case "Mes" lsValorFecha = Format(Me.pdtFHAlta, "MMMM") Case "DiaSemana" lsValorFecha = Format(Me.pdtFHAlta, "dddd") End Select Console.WriteLine("Empleado {0}", Me.psNombre) Console.WriteLine("Incorporado {0}", lsValorFecha)

End Sub End Class

Código fuente 254

Pasando seguidamente a la sobre-escritura, escribiremos en la clase padre el método MostrarNombre( ), y lo sobrescribiremos en la clase hija. Instanciaremos después un objeto Administrativo y lo asignaremos a la variable tipificada como Empleado. Debido a que el enlace tardío se basa en el tipo del objeto que contiene la variable, y no en el tipo de la variable, al llamar al método MostrarNombre( ), se ejecutará la versión de la clase Administrativo. Veamos el Código fuente 255.

Module Module1 Sub Main() Dim loPersona As Empleado loPersona = New Administrativo() loPersona.psNombre = "Juan García" ' como la sobre-escritura utiliza enlace tardío, ' se basa en el objeto que contiene la variable y ' no en el tipo de dato de la variable, se ejecuta ' la versión del método MostrarNombre() que está

© Grupo EIDOS 19. Constructores y herencia

' en la clase Administrativo, ya que el objeto ' que contiene la variable loPersona es una ' instancia de Administrativo 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 Public Overrides Sub MostrarNombre() Console.WriteLine("Nombre del empleado") Console.WriteLine("===================") Console.WriteLine(UCase(Me.psNombre))

End Sub End Class

Código fuente 255

La Tabla 25 muestra, al utilizar sobre-escritura, 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 Derivada Derivada Derivada Derivada

Tabla 25. Método ejecutado mediante enlace tardío bajo sobre-escritura.

Debido al hecho de que los miembros sobrescritos emplean enlace tardío, otra de las denominaciones que se utiliza para ellos es la de método virtual.