Compartir a través de


Consideraciones sobre la sobrecarga de procedimientos (Visual Basic)

Al sobrecargar un procedimiento, debe usar una firma diferente para cada versión sobrecargada. Esto suele significar que cada versión debe especificar una lista de parámetros diferente. Para obtener más información, vea "Firma diferente" en Sobrecarga de procedimientos.

Puede sobrecargar un Function procedimiento con un Sub procedimiento y viceversa, siempre que tengan firmas diferentes. Dos sobrecargas no pueden diferenciarse únicamente porque una tiene un valor de retorno y la otra 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 tiene alternativas a las versiones sobrecargadas, especialmente cuando la presencia de argumentos es opcional o su número es variable.

Tenga en cuenta que todos los lenguajes no admiten necesariamente los argumentos opcionales y las matrices de parámetros se limitan a Visual Basic. Si está escribiendo un procedimiento al que es probable que se llame desde código escrito en cualquiera de varios lenguajes diferentes, las versiones sobrecargadas ofrecen la mayor flexibilidad.

Sobrecargas y argumentos opcionales

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 esperaba que el código de llamada proporcione.

Cuándo usar parámetros opcionales

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

  • 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 define una sola versión con uno o varios Optional parámetros.

Para obtener más información, vea 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 de 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 puede 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 de procedimiento se presta para 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, vea Matrices de parámetros.

Sobrecargas implícitas para parámetros opcionales

Un procedimiento con un parámetro Optional es equivalente 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 ninguno de estos procedimientos. 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)

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

Sobrecargas implícitas para un parámetro ParamArray

El compilador considera un procedimiento con un parámetro ParamArray para tener un número infinito de sobrecargas, que difieren entre sí en lo que el código de llamada pasa a la matriz de parámetros, como se indica a continuación:

  • 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 declaraciones siguientes 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 desea 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 cada tipo de datos que prevé recibir.

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

Consulte también