Consideraciones sobre la sobrecarga de procedimientos

Actualización: noviembre 2007

Cuando se sobrecarga un procedimiento, debe utilizarse una firma diferente en 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, vea "Firmas diferentes" en Sobrecarga de procedimientos.

Se puede sobrecargar un procedimiento Function con un procedimiento Sub, y viceversa, a condición de que sus firmas sean diferentes. Dos sobrecargas no pueden diferir únicamente en que una tenga un valor devuelto y la otra no.

Se puede sobrecargar una propiedad del mismo modo que se sobrecarga un procedimiento, pero también con las mismas restricciones. Sin embargo, no se puede sobrecargar un procedimiento con una propiedad, o viceversa.

Alternativas a las versiones sobrecargadas

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

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

Sobrecargas y argumentos opcionales

Cuando el código de llamada puede proporcionar u omitir uno o varios argumentos, se pueden definir varias versiones sobrecargadas o utilizar parámetros opcionales.

Cuándo utilizar versiones sobrecargadas

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

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

  • El código del procedimiento no puede probar con seguridad si el código de llamada ha proporcionado un argumento opcional. Esto ocurre, por ejemplo, si no se puede esperar que el código de llamada proporcione un candidato posible a un valor predeterminado.

Cuándo utilizar parámetros opcionales

Es posible que prefiera utilizar 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 una situación como esta, el código del procedimiento puede resultar menos complicado si se define una única versión con uno o varios parámetros Optional.

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 utilizar una matriz de parámetros.

Cuándo utilizar versiones sobrecargadas

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

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

  • La lógica del código del procedimiento difiere significativamente en función de la cantidad de valores que transfiere el código de llamada.

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

Cuándo utilizar una matriz de parámetros

Conviene utilizar un parámetro ParamArray en los casos siguientes:

  • No se puede predecir cuántos valores puede pasar el código de llamada a la matriz de parámetros, y puede tratarse de un número elevado.

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

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

Sobrecargas implícitas de parámetros opcionales

Un procedimiento con un parámetro Optional (Visual Basic) equivale a dos procedimientos sobrecargados, uno con el parámetro opcional y otro sin él. No puede sobrecargar este tipo de procedimiento con una lista de parámetros que se corresponda con cualquiera de ellos. Las siguientes declaraciones ilustran este comportamiento:

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)

Existe un conjunto de sobrecargas implícitas para un procedimiento con varios argumentos opcionales, a las que se llega por una lógica similar a la del ejemplo anterior.

Sobrecargas implícitas de 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 la información que el código de llamada pasa a la matriz de parámetros, como se muestra a continuación:

  • Una sobrecarga cuando el código de llamada no proporciona ningún argumento a ParamArray

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

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

Las siguientes declaraciones ilustran 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 puede sobrecargar este tipo de procedimiento con una lista de parámetros que tome una matriz unidimensional para la matriz de parámetros. Sin embargo, puede utilizar las firmas de las otras sobrecarga implícitas. Las siguientes declaraciones ilustran este comportamiento:

' 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 transfiera tipos de datos diferentes a un parámetro, un enfoque alternativo es Programación sin tipos en Visual Basic. Puede establecer el modificador de comprobación de tipo en Off con la opción del compilador Option Strict (Instrucción) u /optionstrict. No tiene que declarar después el tipo de datos del parámetro. No obstante, este planteamiento presenta estas desventajas en comparación con la sobrecarga:

  • La programación sin tipos hace que la ejecución del código sea menos eficiente.

  • El procedimiento debe comprobar todos los tipos de datos que anticipe que se le van a pasar.

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

Vea también

Tareas

Procedimientos de solución de problemas

Cómo: Definir varias versiones de un procedimiento

Cómo: Llamar a un procedimiento sobrecargado

Cómo: Sobrecargar un procedimiento que toma parámetros opcionales

Cómo: Sobrecargar un procedimiento que toma un número indefinido de parámetros

Conceptos

Procedimientos en Visual Basic

Argumentos y parámetros de procedimiento

Resolución de sobrecargas

Referencia

Overloads