Sobrecarga de procedimientos

Sobrecarga de procedimientos

Si bien el uso de parámetros opcionales es un medio para ahorrar al programador el paso de los mismos en situaciones en las que no son necesarios, resulta una solución un tanto artificiosa, ya que lo que realmente hace es complicar más que facilitar la escritura de código.

VB.NET aporta al lenguaje una nueva técnica que permite obviar el uso de parámetros opcionales por una solución más elegante y flexible: los procedimientos sobrecargados.

Antes de explicar en qué consiste un procedimiento sobrecargado, situémonos en el siguiente escenario:

Necesitamos mostrar los datos de un empleado de dos formas, en función del modo de consulta. Por un lado visualizaríamos su nombre, domicilio y localidad; y por otra parte su edad, DNI y fecha de alta en la empresa.

Con lo que sabemos hasta el momento, podríamos resolver este problema escribiendo un procedimiento con parámetros opcionales, y según pasáramos un valor u otro, mostrar la información correspondiente.

El Código fuente 131 muestra este modo de resolver el problema. El uso de la estructura If...End If será explicado posteriormente en el apartado dedicado a estructuras de control, por lo que aclararemos brevemente al lector que el uso de esta estructura nos permite ejecutar bloques de código en función

de que la expresión utilizada a continuación de If se evalúe o no a Verdadero.

Sub Main() ' mostrar datos del empleado ' en función del nombre VerDatosEmpleado("Pedro")

Programación con Visual Basic .NET © Grupo EIDOS

' mostrar datos del empleado ' en función de la edad VerDatosEmpleado(, 28)

Console.ReadLine() End Sub

Sub VerDatosEmpleado(Optional ByVal Nombre As String = "X", Optional ByVal Edad As Integer = 999)

If Nombre <> "X" Then Console.WriteLine("Nombre del empleado: {0}", Nombre) Console.WriteLine("Domicilio: Colina Alta,12") Console.WriteLine("Localidad: Salamanca")

End If

If Edad <> 999 Then Console.WriteLine("Edad del empleado: {0}", Edad) Console.WriteLine("DNI:21555666") Console.WriteLine("Fecha de alta en la empresa: 10/4/1997")

End If

Console.WriteLine() End Sub

Código fuente 131

El uso de parámetros opcionales, como acabamos de constatar, resulta engorroso, ya que nos obliga a comprobar qué valor ha sido pasado y mostrar los datos correspondientes en consecuencia. Tenemos además, un inconveniente añadido, y es que podemos pasar los dos parámetros a la vez, con lo que se mostrarían todos los datos, cuando lo que queremos es visualizar un grupo u otro en cada llamada.

Una aproximación diferente al problema sería escribir dos procedimientos distintos, y llamar a uno u otro según los datos que necesitemos. Ver Código fuente 132.

Sub Main() ' mostrar datos del empleado según nombre VerEmpleNombre("Pedro")

' mostrar datos del empleado según edad VerEmpleNum(28)

Console.ReadLine() End Sub

Public Sub VerEmpleNombre(ByVal Nombre As String) Console.WriteLine("Datos empleado por nombre") Console.WriteLine("Nombre del empleado: {0}", Nombre) Console.WriteLine("Domicilio: Colina Alta,12") Console.WriteLine("Localidad: Salamanca") Console.WriteLine()

End Sub

Public Sub VerEmpleNum(ByVal Edad As Integer) Console.WriteLine("Datos empleado por edad") Console.WriteLine("Edad del empleado: {0}", Edad)

© Grupo EIDOS 14. Rutinas de código

Console.WriteLine("DNI:21555666") Console.WriteLine("Fecha de alta en la empresa: 10/4/1997") Console.WriteLine()

End Sub

Código fuente 132.

Sin embargo, esta solución nos obliga a tener que saber varios nombres de procedimiento, con lo que tampoco ayuda mucho a simplificar el código.

¿No sería ideal, disponer de un único nombre de procedimiento y que este fuera lo suficientemente inteligente para mostrar los datos adecuados en cada caso?, pues esta característica está implementada en VB.NET a través de la sobrecarga de procedimientos.

La sobrecarga de procedimientos es una técnica que consiste en crear varias versiones de un mismo procedimiento, distinguiéndose entre sí por la lista de parámetros o protocolo de llamada del procedimiento.

Para definir un procedimiento como sobrecargado, debemos comenzar su declaración con la palabra clave Overloads. Podemos utilizar procedimientos tanto Sub como Function cuando realizamos sobrecarga., siendo posible que una de las implementaciones no tenga lista de parámetros. El Código fuente 133 muestra un ejemplo de sobrecarga.

Overloads Sub Datos() ' código del procedimiento ' ............ ' ............

End Sub

Overloads Sub Datos(ListaParametrosA) ' código del procedimiento ' ............ ' ............

End Sub

Overloads Function Datos(ListaParametrosB) As TipoDatoRetorno ' código del procedimiento ' ............ ' ............

End Function

Código fuente 133

En el ejemplo anterior, cuando llamemos al procedimiento Datos( ), el entorno de .NET Framework, en función de si pasamos o no parámetros al procedimiento, y de cómo sean estos parámetros, ejecutará la versión adecuada del procedimiento.

Ya que el protocolo o firma del procedimiento es el elemento que emplea el CLR para diferenciar cada una de sus versiones o implementaciones, las listas de parámetros de cada versión deben ser diferentes al menos en uno de los siguientes aspectos:

• Número de parámetros. • Orden de los parámetros.

Programación con Visual Basic .NET © Grupo EIDOS

• Tipo de dato de los parámetros. Por consiguiente, no es posible crear dos procedimientos sobrecargados que sólo se diferencien en los

nombres de los parámetros, por los modificadores de ámbito (Public, Private, etc.), o por el tipo de dato de retorno en el caso de un procedimiento Function.

Una vez vistas las normas y restricciones aplicables a los procedimientos sobrecargados, veamos en el Código fuente 134 como solucionaríamos el problema planteado al comienzo de este apartado empleando esta técnica.

Sub Main() Dim Dias As Integer ' mostrar datos del empleado según nombre VerEmpleado("Pedro")

' mostrar datos del empleado según edad Dias = VerEmpleado(28) Console.WriteLine("Días libres del empleado: {0}", Dias) Console.WriteLine()

' mostrar salario pasando las horas trabajadas VerEmpleado(25, 80)

Console.ReadLine() End Sub

Overloads Sub VerEmpleado(ByVal Nombre As String) Console.WriteLine("Datos empleado por nombre") Console.WriteLine("Nombre del empleado: {0}", Nombre) Console.WriteLine("Domicilio: Colina Alta,12") Console.WriteLine("Localidad: Salamanca") Console.WriteLine()

End Sub

Overloads Function VerEmpleado(ByVal Edad As Integer) As Integer Dim DiasLibres As Integer Console.WriteLine("Datos empleado por edad") Console.WriteLine("Edad del empleado: {0}", Edad) Console.WriteLine("DNI:21555666") Console.WriteLine("Fecha de alta en la empresa: 10/4/1997") Console.WriteLine()

DiasLibres = 5 Return DiasLibres

End Function

Overloads Sub VerEmpleado(ByVal PrecioHora As Integer, ByVal HorasTrabajadas As Long)

Dim Salario As Long

Salario = PrecioHora * HorasTrabajadas Console.WriteLine("Salario según horas: {0}", Salario) Console.WriteLine()

End Sub

Código fuente 134

En este código hemos creado tres versiones sobrecargadas del procedimiento VerEmpleado( ). En una mostramos los datos del empleado según el nombre; en otra también mostramos otro conjunto de datos según la edad y además, al ser una función, devolvemos el número de días libres del empleado;

© Grupo EIDOS 14. Rutinas de código

finalmente en una tercera implementación, calculamos el salario según el precio por hora y las horas trabajadas, que pasamos al protocolo de llamada. Desde Main( ) por lo tanto, siempre llamamos al procedimiento VerEmpleado( ).