Consideraciones sobre la sobrecarga de procedimientos (Visual Basic)

Al sobrecargar un procedimiento, debes usar una firma diferente para cada versión sobrecargada. Normalmente, esto significa que cada versión debe especificar una lista de parámetros diferente. Para obtener más información, consulta «Firma diferente» en Sobrecarga de procedimientos.

Puedes sobrecargar un procedimiento Function con un procedimiento Sub, y viceversa, siempre que tengan firmas diferentes. Dos sobrecargas no pueden diferir solo en que uno tiene un valor devuelto y el otro no.

Puedes sobrecargar una propiedad de la misma manera que sobrecarga un procedimiento y con las mismas restricciones. Sin embargo, no se puede sobrecargar un procedimiento con una propiedad o viceversa.

Alternativas a versiones sobrecargadas

A veces tienes alternativas a las versiones sobrecargadas, especialmente cuando la presencia de argumentos es opcional o su número es variable.

Ten en cuenta que los argumentos opcionales no son necesariamente compatibles con todos los lenguajes y las matrices de parámetros se limitan a Visual Basic. Si estás escribiendo un procedimiento que es probable que se llame desde el código escrito en cualquiera de los distintos lenguajes, las versiones sobrecargadas ofrecen la mayor flexibilidad.

Argumentos opcionales y sobrecargas

Si el código de llamada puede proporcionar o omitir uno o varios argumentos, puede definir varias versiones sobrecargadas o usar parámetros opcionales.

Cuándo usar versiones sobrecargadas

Puedes considerar la posibilidad de definir una serie de versiones sobrecargadas en los casos siguientes:

  • La lógica del código de procedimiento es significativamente diferente en función de si el código de llamada proporciona un argumento opcional o no.

  • El código de procedimiento no puede probar de forma confiable si el código de llamada ha proporcionado un argumento opcional. Este es el caso, por ejemplo, si no hay ningún candidato posible para un valor predeterminado que no se espera que proporcione el código que realiza la llamada.

Cuándo usar parámetros opcionales

Es posible que prefieras uno o varios parámetros opcionales en los casos siguientes:

  • La única acción necesaria cuando el código de llamada no proporciona un argumento opcional es establecer el parámetro en un valor predeterminado. En tal caso, el código de procedimiento puede ser menos complicado si defines una sola versión con uno o varios parámetros Optional.

Para obtener más información, consulta Parámetros opcionales.

Sobrecargas y ParamArrays

Cuando el código de llamada puede pasar un número variable de argumentos, puede definir varias versiones sobrecargadas o usar una matriz de parámetros.

Cuándo usar versiones sobrecargadas

Puedes considerar la posibilidad de definir una serie de versiones sobrecargadas en los casos siguientes:

  • Sabes que el código que llama nunca pasa más de un pequeño número de valores a la matriz de parámetros.

  • La lógica del código de procedimiento es significativamente diferente en función del número de valores que pasa el código que realiza la llamada.

  • El código de llamada puede pasar valores de diferentes tipos de datos.

Cuándo usar una matriz de parámetros

Un parámetro ParamArray sirve mejor en los casos siguientes:

  • No puedes predecir cuántos valores puede pasar el código de llamada a la matriz de parámetros y podría ser un gran número.

  • La lógica del procedimiento se presta a recorrer en iteración todos los valores que pasa el código de llamada, realizando esencialmente las mismas operaciones en cada valor.

Para obtener más información, consulta Matrices de parámetros.

Sobrecargas implícitas para parámetros opcionales

Un procedimiento con un parámetro Opcional equivale a dos procedimientos sobrecargados, uno con el parámetro opcional y otro sin él. No se puede sobrecargar este procedimiento con una lista de parámetros correspondiente a cualquiera de estos. Las siguientes declaraciones ilustran esto.

Overloads Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)
' The preceding definition is equivalent to the following two overloads.
' Overloads Sub q(ByVal b As Byte)
' Overloads Sub q(ByVal b As Byte, ByVal j As Long)
' Therefore, the following overload is not valid because the signature is already in use.
' Overloads Sub q(ByVal c As Byte, ByVal k As Long)
' The following overload uses a different signature and is valid.
Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)

Para un procedimiento con más de un parámetro opcional, hay un conjunto de sobrecargas implícitas, llegado por lógica similar a la del ejemplo anterior.

Sobrecargas implícitas para un parámetro ParamArray

El compilador considera que un procedimiento con un parámetro ParamArray tiene un número infinito de sobrecargas, que se diferencian entre sí por lo que el código de llamada pasa a la matriz de parámetros, como sigue:

  • Una sobrecarga para cuando el código que realiza la llamada no proporciona un argumento a ParamArray

  • Una sobrecarga para cuando el código de llamada proporciona una matriz unidimensional del tipo de elemento ParamArray

  • Para cada entero positivo, una sobrecarga para cuando el código de llamada proporciona ese número de argumentos, cada uno del tipo de elemento ParamArray

Las siguientes declaraciones muestran estas sobrecargas implícitas.

Overloads Sub p(ByVal d As Date, ByVal ParamArray c() As Char)
' The preceding definition is equivalent to the following overloads.
' Overloads Sub p(ByVal d As Date)
' Overloads Sub p(ByVal d As Date, ByVal c() As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char)
' And so on, with an additional Char argument in each successive overload.

No se puede sobrecargar este procedimiento con una lista de parámetros que toma una matriz unidimensional para la matriz de parámetros. Sin embargo, puedes usar las firmas de las demás sobrecargas implícitas. Las siguientes declaraciones ilustran esto.

' The following overload is not valid because it takes an array for the parameter array.
' Overloads Sub p(ByVal x As Date, ByVal y() As Char)
' The following overload takes a single value for the parameter array and is valid.
Overloads Sub p(ByVal z As Date, ByVal w As Char)

Programación sin tipos como alternativa a la sobrecarga

Si deseas permitir que el código de llamada pase distintos tipos de datos a un parámetro, un enfoque alternativo es la programación sin tipos. Puedes establecer el modificador Off de comprobación de tipos en con la opción Option Strict Statement o la opción del compilador -optionstrict. A continuación, no es necesario declarar el tipo de datos del parámetro. Sin embargo, este enfoque tiene las siguientes desventajas en comparación con la sobrecarga:

  • La programación sin tipos genera código de ejecución menos eficaz.

  • El procedimiento debe probar para cada tipo de datos que prevé pasar.

  • El compilador no puede indicar un error si el código que realiza la llamada pasa un tipo de datos que el procedimiento no admite.

Consulte también