Megosztás a következőn keresztül:


Túlterhelés feloldás (Visual Basic)

A Visual Basic fordítónak el kell döntenie, hogy melyik túlterhelést kell meghívnia, ha egy eljárás több túlterhelt verzióban van meghatározva. A következő lépések végrehajtásával dönt:

  1. Hozzáférhetőség. Kiküszöböli a túlterhelést olyan hozzáférési szinttel, amely megakadályozza a hívó kód meghívását.
  2. Paraméterek száma. Kiküszöböl minden olyan túlterhelést, amely a hívásban megadotttól eltérő számú paramétert határoz meg.
  3. Paraméter adattípusai. A fordító a példánymetelyeket részesíti előnyben a bővítménymetelyekkel szemben. Ha található olyan példánymetódus, amely csak szélesítő konverziókat igényel az eljáráshívás megfeleléséhez, akkor az összes kiterjesztési metódust elveti a rendszer. A fordítóprogram csak a példánymetódus-jelöltekkel folytatódik. Ha nem található ilyen példánymetódus, akkor a példány- és a bővítménymetódusokkal is folytatódik. Ebben a lépésben kiküszöböli azokat a túlterheléseket, amelyeknél a hívó argumentumok adattípusai nem konvertálhatók a túlterhelésben definiált paramétertípusokká.
  4. Konverziók szűkítése. Kiküszöböli azokat a túlterheléseket, amelyek a hívó argumentumtípusoktól a megadott paramétertípusokra való szűkítést igénylik. Ez a lépés megtörténik, függetlenül attól, hogy a típus-ellenőrző kapcsoló (Option Strict Statement) On vagy Off.
  5. Minimális szélesítés. A fordító páronként veszi figyelembe a fennmaradó túlterheléseket. Minden pár esetében összehasonlítja a definiált paraméterek adattípusait. Ha az egyik túlterhelésben lévő típusok a másikban lévő megfelelő típusokra szélesednek, a fordító kiküszöböli az utóbbit. Vagyis megtartja a túlterhelést, amely a legkisebb mértékű szélesítést igényli.
  6. Túlterhelés feloldási prioritása. A fordító eltávolít minden olyan túlterhelést, amelynek OverloadResolutionPriorityAttribute értéke alacsonyabb, mint bármelyik lehetséges túlterhelés legmagasabb értéke. Az attribútum nélküli túlterhelések az alapértelmezett nulla értékhez vannak rendelve.
  7. Egyetlen jelölt. Továbbra is figyelembe veszi a páronkénti túlterheléseket, amíg csak egy túlterhelés marad, és ehhez az egyhez irányítja a hívást. Ha a fordító nem tudja egyetlen jelöltre csökkenteni a túlterhelést, hibát okoz.

Az alábbi ábra azt a folyamatot mutatja be, amely meghatározza, hogy a túlterhelt verziók közül melyiket kell meghívni.

túlterhelésfeloldási folyamat folyamatábra

Az alábbi példa ezt a túlterhelésfeloldási folyamatot szemlélteti.

Overloads Sub z(ByVal x As Byte, ByVal y As Double)
End Sub
Overloads Sub z(ByVal x As Short, ByVal y As Single)
End Sub
Overloads Sub z(ByVal x As Integer, ByVal y As Single)
End Sub
Dim r, s As Short
Call z(r, s)
Dim p As Byte, q As Short
' The following statement causes an overload resolution error.
Call z(p, q)

Az első hívás során a fordító megszünteti az első túlterhelést, mivel az első argumentum típusa (Short) a megfelelő paraméter típusára (Byte) szűkül. Ezzel kiküszöböli a harmadik túlterhelést, mivel a második túlterhelés minden argumentumtípusa (Short és Single) a harmadik túlterhelés megfelelő típusára (Integer és Single) szélesedik. A második túlterhelés kisebb szélesítést igényel, ezért a fordító azt használja a híváshoz.

A második hívásban a fordító nem tudja kiküszöbölni a túlterhelési lehetőségeket a szűkítés alkalmazása alapján. A harmadik túlterhelést ugyanazért szünteti meg, mint az első hívásban, mivel a második túlterhelést az argumentumtípusok kevésbé szélesítésével hívhatja meg. A fordító azonban nem tud dönteni az első és a második túlterhelt függvény között. Mindegyiknek van egy definiált paramétertípusa, amely a másikban a megfelelő típusra szélesít (ByteShort, de Single a Double). A fordító ezért generál egy túlterhelés-feloldási hibát.

Túlterhelt Optional és ParamArray argumentumok

Ha egy eljárás két túlterhelése azonos aláírással rendelkezik, azzal a kivételével, hogy az utolsó paraméter deklarálva van Választható az egyikben, a másikban pedig ParamArray, a fordító az alábbi módon oldja fel az eljárás hívását:

Ha a hívás megadja az utolsó argumentumot A fordító a túlterhelés hívását az utolsó argumentumot deklaráló módon oldja fel.
Nincs érték (argumentum nincs megadva) Optional
Egyetlen érték Optional
Két vagy több érték vesszővel tagolt listában ParamArray
Tetszőleges hosszúságú tömb (beleértve az üres tömböt is) ParamArray

Lásd még: