Considerações sobre procedimentos de sobrecarga (Visual Basic)
Ao sobrecarregar um procedimento, você deve usar uma assinatura diferente para cada versão sobrecarregada. Isso geralmente significa que cada versão deve especificar uma lista de parâmetros diferente. Para obter mais informações, consulte "Assinatura diferente" na sobrecarga de procedimento.
Você pode sobrecarregar um Function
procedimento com um Sub
procedimento e vice-versa, desde que eles tenham assinaturas diferentes. Duas sobrecargas não podem ser diferentes apenas porque uma tem um valor retornado e a outra não.
Você pode sobrecarregar uma propriedade da mesma forma que sobrecarrega um procedimento e com as mesmas restrições. No entanto, você não pode sobrecarregar um procedimento com uma propriedade ou vice-versa.
Alternativas a versões sobrecarregadas
Às vezes, você tem alternativas para versões sobrecarregadas, especialmente quando a presença de argumentos é opcional ou seu número é variável.
Tenha em mente que os argumentos opcionais não são necessariamente compatíveis com todos os idiomas e as matrizes de parâmetros estão limitadas ao Visual Basic. Se você estiver escrevendo um procedimento que provavelmente será chamado do código escrito em qualquer um dos vários idiomas diferentes, as versões sobrecarregadas oferecerão a maior flexibilidade.
Sobrecargas e argumentos opcionais
Quando o código de chamada pode, opcionalmente, fornecer ou omitir um ou mais argumentos, você pode definir várias versões sobrecarregadas ou usar parâmetros opcionais.
Quando usar versões sobrecarregadas
Você pode considerar a definição de uma série de versões sobrecarregadas nos seguintes casos:
A lógica no código do procedimento é significativamente diferente dependendo se o código de chamada fornece um argumento opcional ou não.
O código do procedimento não pode testar de forma confiável se o código de chamada forneceu um argumento opcional. Esse é o caso, por exemplo, se não houver nenhum candidato possível para um valor padrão que o código de chamada não poderia fornecer.
Quando usar parâmetros opcionais
Você pode preferir um ou mais parâmetros opcionais nos seguintes casos:
- A única ação necessária quando o código de chamada não fornece um argumento opcional é definir o parâmetro como um valor padrão. Nesse caso, o código do procedimento pode ser menos complicado se você definir uma única versão com um ou mais
Optional
parâmetros.
Para obter mais informações, confira Parâmetros opcionais.
Sobrecargas e ParamArrays
Quando o código de chamada pode passar um número variável de argumentos, você pode definir várias versões sobrecarregadas ou usar uma matriz de parâmetros.
Quando usar versões sobrecarregadas
Você pode considerar a definição de uma série de versões sobrecarregadas nos seguintes casos:
Você sabe que o código de chamada nunca passa mais do que um pequeno número de valores para a matriz de parâmetros.
A lógica no código do procedimento é significativamente diferente dependendo de quantos valores o código de chamada passa.
O código de chamada pode passar valores de diferentes tipos de dados.
Quando usar uma matriz de parâmetros
Você é melhor atendido por um ParamArray
parâmetro nos seguintes casos:
Você não pode prever quantos valores o código de chamada pode passar para a matriz de parâmetros e pode ser um número grande.
A lógica de procedimento se presta a iterar por meio de todos os valores que o código de chamada passa, executando essencialmente as mesmas operações em cada valor.
Para obter mais informações, confira Matriz de parâmetros.
Sobrecargas implícitas para parâmetros opcionais
Um procedimento com um parâmetro opcional é equivalente a dois procedimentos sobrecarregados, um com o parâmetro opcional e outro sem ele. Não é possível sobrecarregar esse procedimento com uma lista de parâmetros correspondente a qualquer um deles. As declarações a seguir ilustram isso.
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 um procedimento com mais de um parâmetro opcional, há um conjunto de sobrecargas implícitas, chegadas por lógica semelhante à do exemplo anterior.
Sobrecargas implícitas para um parâmetro ParamArray
O compilador considera que um procedimento com um parâmetro ParamArray tem um número infinito de sobrecargas, diferentes umas das outras no que o código de chamada passa para a matriz de parâmetros, da seguinte maneira:
Uma sobrecarga para quando o código de chamada não fornece um argumento para o
ParamArray
Uma sobrecarga para quando o código de chamada fornece uma matriz unidimensional do
ParamArray
tipo de elementoPara cada inteiro positivo, uma sobrecarga para quando o código de chamada fornece esse número de argumentos, cada um dos
ParamArray
tipos de elemento
As declarações a seguir ilustram essas 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.
Você não pode sobrecarregar esse procedimento com uma lista de parâmetros que usa uma matriz unidimensional para a matriz de parâmetros. No entanto, você pode usar as assinaturas das outras sobrecargas implícitas. As declarações a seguir ilustram isso.
' 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)
Programação sem tipo como alternativa à sobrecarga
Se você quiser permitir que o código de chamada passe tipos de dados diferentes para um parâmetro, uma abordagem alternativa é a programação sem tipo. Você pode definir a opção Off
de verificação de tipo com a instrução Option Strict ou a opção do compilador -optionstrict. Em seguida, você não precisa declarar o tipo de dados do parâmetro. No entanto, essa abordagem tem as seguintes desvantagens em comparação com a sobrecarga:
A programação sem tipo produz um código de execução menos eficiente.
O procedimento deve testar cada tipo de dados que ele prevê ser passado.
O compilador não poderá sinalizar um erro se o código de chamada passar um tipo de dados que o procedimento não dá suporte.
Confira também
- Procedimentos
- Parâmetros e Argumentos de Procedimento
- Solucionando problemas de procedimentos
- Como definir várias versões de um procedimento
- Como chamar um procedimento sobrecarregado
- Como sobrecarregar um procedimento que usa parâmetros opcionais
- Como sobrecarregar um procedimento que usa um número indefinido de parâmetros
- Resolução de Sobrecarga
- Sobrecargas