Dela via


Överväganden i överlagringsprocedurer (Visual Basic)

När du överbelastar en procedur måste du använda en annan signatur för varje överbelastad version. Det innebär vanligtvis att varje version måste ange en annan parameterlista. Mer information finns i "Annan signatur" i Överlagring av procedurer.

Du kan överbelasta en Function procedur med en Sub procedur, och vice versa, förutsatt att de har olika signaturer. Två överlagringar kan inte bara skilja sig åt eftersom den ena har ett returvärde och den andra inte.

Du kan överbelasta en egenskap på samma sätt som du överbelastar en procedur och med samma begränsningar. Du kan dock inte överbelasta en procedur med en egenskap eller vice versa.

Alternativ till överlagrade versioner

Du har ibland alternativ till överlagrade versioner, särskilt när förekomsten av argument är valfri eller deras antal är variabel.

Tänk på att valfria argument inte nödvändigtvis stöds av alla språk och att parametermatriser är begränsade till Visual Basic. Om du skriver en procedur som sannolikt kommer att anropas från kod som skrivits på något av flera olika språk ger överlagrade versioner den största flexibiliteten.

Överlagringar och valfria argument

När den anropande koden kan ange eller utelämna ett eller flera argument kan du definiera flera överlagrade versioner eller använda valfria parametrar.

När du ska använda överlagrade versioner

Du kan överväga att definiera en serie överlagrade versioner i följande fall:

  • Logiken i procedurkoden skiljer sig avsevärt beroende på om anropskoden tillhandahåller ett valfritt argument eller inte.

  • Procedurkoden kan inte på ett tillförlitligt sätt testa om den anropande koden har angett ett valfritt argument. Detta är till exempel fallet om det inte finns någon möjlig kandidat för ett standardvärde som den anropande koden inte kunde förväntas ange.

När du ska använda valfria parametrar

Du kanske föredrar en eller flera valfria parametrar i följande fall:

  • Den enda nödvändiga åtgärden när den anropande koden inte anger ett valfritt argument är att ange parametern till ett standardvärde. I sådana fall kan procedurkoden vara mindre komplicerad om du definierar en enskild version med en eller flera Optional parametrar.

Mer information finns i Valfria parametrar.

Överlagringar och ParamArrays

När den anropande koden kan skicka ett variabelt antal argument kan du definiera flera överlagrade versioner eller använda en parametermatris.

När du ska använda överlagrade versioner

Du kan överväga att definiera en serie överlagrade versioner i följande fall:

  • Du vet att den anropande koden aldrig skickar mer än ett litet antal värden till parametermatrisen.

  • Logiken i procedurkoden skiljer sig avsevärt beroende på hur många värden den anropande koden skickar.

  • Den anropande koden kan skicka värden för olika datatyper.

När du ska använda en parametermatris

Du får bättre hjälp av en ParamArray parameter i följande fall:

  • Du kan inte förutsäga hur många värden som anropande kod kan skicka till parametermatrisen, och det kan vara ett stort tal.

  • Procedurelogik lämpar sig för iterering genom alla värden som anropande kod skickar och utför i stort sett samma åtgärder på varje värde.

Mer information finns i Parametermatriser.

Implicita överlagringar för valfria parametrar

En procedur med en valfri parameter motsvarar två överlagrade procedurer, en med den valfria parametern och en utan den. Du kan inte överbelasta en sådan procedur med en parameterlista som motsvarar någon av dessa. Följande deklarationer illustrerar detta.

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)

För en procedur med mer än en valfri parameter finns det en uppsättning implicita överlagringar som har kommit fram med logik som liknar den i föregående exempel.

Implicita överlagringar för en ParamArray-parameter

Kompilatorn anser att en procedur med en ParamArray-parameter har ett oändligt antal överlagringar, som skiljer sig från varandra i vad den anropande koden skickar till parametermatrisen enligt följande:

  • En överlagring för när anropskoden inte anger ett argument till ParamArray

  • En överlagring för när anropskoden tillhandahåller en endimensionell matris av ParamArray elementtypen

  • För varje positivt heltal, en överlagring för när anropande kod tillhandahåller det antalet argument, var och en av ParamArray elementtypen

Följande deklarationer illustrerar dessa implicita överlagringar.

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.

Du kan inte överbelasta en sådan procedur med en parameterlista som tar en endimensionell matris för parametermatrisen. Du kan dock använda signaturerna för de andra implicita överlagringarna. Följande deklarationer illustrerar detta.

' 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)

Typlös programmering som ett alternativ till överlagring

Om du vill tillåta att anropskoden skickar olika datatyper till en parameter är en alternativ metod typlös programmering. Du kan ange typkontrollväxeln till Off med alternativet Strikt instruktion eller kompilatoralternativet -optionstrict . Då behöver du inte deklarera parameterns datatyp. Den här metoden har dock följande nackdelar jämfört med överlagring:

  • Typlös programmering ger mindre effektiv körningskod.

  • Proceduren måste testas för varje datatyp som den förväntar sig att skickas.

  • Kompilatorn kan inte signalera ett fel om den anropande koden skickar en datatyp som proceduren inte stöder.

Se även