Enlace tardío

Enlace tardío

También conocido como late binding o dynamic binding, este enlace establece que las referencias entre la variable y el objeto que contiene van a ser resueltas en tiempo de ejecución.

El principal inconveniente en este tipo de enlace radica en que el código generado será más lento, ya que desconoce con qué miembros de objeto tendrá que trabajar, debiendo averiguar esta información durante la ejecución del programa. Adicionalmente, el trabajo del programador será también mayor, ya que tendrá que conocer con antelación, la lista de miembros o interfaz que implementa el objeto.

Como ventaja nos aporta una mayor flexibilidad, ya que con la misma variable podemos manipular objetos de distinto tipo. Para ello, tendremos que tipificar la variable como Object. Ver Figura 196.

Por ejemplo, si aparte de nuestra conocida clase Empleado, escribimos otra nueva llamada Proveedor, con algunos aspectos similares, como las propiedades Nombre, Apellidos, el método MostrarDatos( ), etc., podremos utilizar la misma variable para manipular cada uno de los objetos que instanciemos de estas clases; evidentemente, tendremos que asignar el objeto pertinente a la variable antes de poder manejarlo.

Vamos incluso a crear otra clase más, llamada Horario, con un método que devuelva la hora actual del sistema, y ejecutaremos dicho método asignando un objeto de esta clase a la misma variable utilizada para manejar los objetos Empleado y Proveedor. Veamos todo en el Código fuente 227.

© Grupo EIDOS 18. Métodos y espacios de nombre

Figura 196. Esquema de funcionamiento del enlace tardío de objetos.

Module General Sub Main() ' tipificamos como Object, ' por lo que obtendremos enlace tardío Dim loVariosObj As Object

' instanciamos un objeto de Empleado loVariosObj = New Empleado() loVariosObj.Nombre = "Juan" loVariosObj.Apellidos = "Rollo" loVariosObj.MostrarDatos()

' instanciamos un objeto de Proveedor loVariosObj = New Proveedor() loVariosObj.Nombre = "Alicia" loVariosObj.Apellidos = "Cañaveral" loVariosObj.MostrarDatos()

' instanciamos un objeto de Horario loVariosObj = New Horario() loVariosObj.HoraActual()

End Sub End Module

Public Class Empleado Private msNombre As String Private msApellidos As String

Public Property Nombre() As String Get Return msNombre End Get Set(ByVal Value As String)

msNombre = Value End Set End Property

Public Property Apellidos() As String Get Return msApellidos End Get Set(ByVal Value As String)

Programación con Visual Basic .NET © Grupo EIDOS

msApellidos = Value End Set End Property

Public Sub MostrarDatos() Console.WriteLine("El empleado seleccionado es: {0} {1}", _ msNombre, msApellidos) Console.ReadLine() End Sub End Class

Public Class Proveedor Private msNombre As String Private msApellidos As String

Public Property Nombre() As String Get Return msNombre End Get Set(ByVal Value As String)

msNombre = Value End Set End Property

Public Property Apellidos() As String Get Return msApellidos End Get Set(ByVal Value As String)

msApellidos = Value End Set End Property

Public Sub MostrarDatos() Console.WriteLine("El proveedor actual es: {0} {1}", _ msNombre, msApellidos) Console.ReadLine() End Sub End Class

Public Class Horario Public Sub HoraActual() Console.WriteLine("Hora del sistema: {0}", Format(Now(), "HH:mm")) Console.ReadLine()

End Sub End Class

Código fuente 227

Otro de los factores indicativos de que se está produciendo enlace tardío reside en que si depuramos este código línea a línea, el depurador no saltará al código de los miembros de los objetos, ya que durante la compilación no ha podido localizar dónde se encuentra su implementación.

De cara a próximos apartados referentes a la herencia, tengamos en cuenta la siguiente regla respecto a los tipos de enlace.

El enlace temprano se basa en el tipo de la referencia o clase establecida al declarar la variable, mientras que el enlace tardío se basa en el tipo del propio objeto asignado a la variable, sin tener en cuenta la clase con que haya sido declarada la variable.

© Grupo EIDOS 18. Métodos y espacios de nombre