Partilhar via


Considerações sobre procedimentos de sobrecarga (Visual Basic)

Quando você sobrecarrega 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" em 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 diferir apenas na medida em que uma tem um valor de retorno 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, não é possível sobrecarregar um procedimento com uma propriedade ou vice-versa.

Alternativas para versões sobrecarregadas

Às vezes, você tem alternativas para versões sobrecarregadas, particularmente quando a presença de argumentos é opcional ou seu número é variável.

Lembre-se de que os argumentos opcionais não são necessariamente suportados por todas as linguagens e as matrizes de parâmetros são limitadas ao Visual Basic. Se você estiver escrevendo um procedimento que provavelmente será chamado a partir de código escrito em qualquer um dos vários idiomas diferentes, as versões sobrecarregadas oferecem 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 de procedimento é significativamente diferente, dependendo se o código de chamada fornece um argumento opcional ou não.

  • O código de procedimento não pode testar de forma confiável se o código de chamada forneceu um argumento opcional. Este é 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 ser esperado para 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 de procedimento pode ser menos complicado se você definir uma única versão com um ou mais Optional parâmetros.

Para obter mais informações, consulte 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 de 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 servido por um ParamArray parâmetro nos seguintes casos:

  • Você não é capaz de prever quantos valores o código de chamada pode passar para a matriz de parâmetros, e pode ser um grande número.

  • A lógica do procedimento presta-se a iterar através 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, consulte Matrizes de parâmetros.

Sobrecargas implícitas para parâmetros opcionais

Um procedimento com um parâmetro Optional é equivalente a dois procedimentos sobrecarregados, um com o parâmetro opcional e outro sem ele. Não é possível sobrecarregar tal procedimento com uma lista de parâmetros correspondente a qualquer um deles. As declarações que se seguem ilustram este facto.

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, obtidas por uma 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, diferindo entre si no que o código de chamada passa para a matriz de parâmetros, da seguinte forma:

  • 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 elemento

  • Para cada inteiro positivo, uma sobrecarga para quando o código de chamada fornece esse número de argumentos, cada um do ParamArray tipo de elemento

As declarações que se seguem ilustram 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.

Não é possível 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 que se seguem ilustram este facto.

' 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 diferentes tipos de dados para um parâmetro, uma abordagem alternativa é a programação sem tipo. Você pode definir a opção de verificação de tipo para Off com a instrução Option Strict ou a opção de compilador -optionstrict. Em seguida, não é necessário declarar o tipo de dados do parâmetro. No entanto, esta 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 prevê ser aprovado.

  • O compilador não pode sinalizar um erro se o código de chamada passar um tipo de dados que o procedimento não suporta.

Consulte também