Rozlišení přetížení (Visual Basic)
Kompilátor jazyka Visual Basic musí rozhodnout, kterou přetíženou verzi zavolat, pokud je procedura definována v několika přetížených verzích. Rozhoduje se provedením následujících kroků:
- Přístupnost. Eliminuje jakýkoliv nadměrný požadavek nastavením úrovně přístupu, který zabraňuje volajícímu kódu, aby ho zavolal.
- Počet parametrů Eliminuje jakékoli přetížení, které definuje jiný počet parametrů, než je zadáno ve volání.
- Datové typy parametrů. Kompilátor dává metodám instance přednost před rozšiřujícími metodami. Pokud je nalezena nějaká metoda instance, která vyžaduje pouze rozšiřující převody tak, aby odpovídaly volání procedury, všechny rozšiřující metody jsou vyřazeny. Kompilátor pokračuje pouze s kandidáty metody instance. Pokud se taková metoda instance nenajde, pokračuje metodami instance i rozšíření. V tomto kroku eliminuje přetížení, pro které nelze převést datové typy volajících argumentů na typy parametrů definované v přetížení.
- Zúžení konverze. Eliminuje jakékoli přetížení, které vyžaduje zúžení převodu z typů volajících argumentů na definované typy parametrů. Tento krok probíhá bez ohledu na to, zda je přepínač pro kontrolu typů (Příkaz Strict) nastaven na
On
neboOff
. - Nejmenší rozšiřování Kompilátor zvažuje zbývající přetížení po dvojicích. Pro každou dvojici porovnává datové typy definovaných parametrů. Pokud se typy v jednom z přetížení rozšíří na odpovídající typy v druhém, kompilátor odstraní druhý typ. To znamená, že zachová přetížení, které vyžaduje nejmenší rozšíření.
- Priorita rozlišení přetížení. Kompilátor odebere všechna přetížení, která mají nižší hodnotu OverloadResolutionPriorityAttribute než nejvyšší hodnota u jakéhokoli z kandidátů na přetížení. Jakékoli přetížení bez tohoto atributu je přiřazena výchozí hodnota nula.
- Jeden kandidát. Pokračuje v zvažování přetížení ve dvojicích, dokud nezůstane pouze jedno přetížení, a vyřeší volání tohoto přetížení. Pokud kompilátor nemůže omezit přetížení na jednoho kandidáta, vygeneruje chybu.
Následující obrázek znázorňuje proces, který určuje, kterou z přetížených verzí má být volána.
diagram toku
Následující příklad ukazuje tento proces řešení přetížení.
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)
V prvním volání kompilátor eliminuje první přetížení, protože typ prvního argumentu (Short
) se zúží na typ odpovídajícího parametru (Byte
). Poté eliminuje třetí přetížení, protože každý typ argumentu ve druhém přetížení (Short
a Single
) se rozšiřuje na odpovídající typ třetího přetížení (Integer
a Single
). Druhé přetížení vyžaduje menší rozšíření, takže ho kompilátor používá pro volání.
Ve druhém volání kompilátor nemůže eliminovat žádné přetížení na základě zúžení. Eliminuje třetí přetížení z stejného důvodu jako v prvním volání, protože může volat druhé přetížení s menším rozšířením typů argumentů. Kompilátor však nemůže rozlišit mezi prvním a druhým přetížením. Každý má jeden definovaný typ parametru, který rozšiřuje na odpovídající typ v druhém (Byte
Short
, ale Single
na Double
). Kompilátor proto generuje chybu řešení přetížení.
Přetížené argumenty Optional
a ParamArray
Pokud dvě přetížení procedury mají identické podpisy s tím rozdílem, že poslední parametr je deklarován jako Volitelné v jednom a ParamArray ve druhém, kompilátor vyřeší volání této procedury následujícím způsobem:
Pokud volání zadá poslední argument jako | Kompilátor vyhodnotí volání přetížené metody, která deklaruje poslední argument jako |
---|---|
Žádná hodnota (argument vynechán) | Optional |
Jedna hodnota | Optional |
Dvě nebo více hodnot v seznamu odděleném čárkami | ParamArray |
Matice libovolné délky (včetně prázdného pole) | ParamArray |
Viz také
- Volitelné parametry
- Pole Parametrů
- Přetížení procedury
- postupy řešení potíží
- Postupy: Definování více verzí procedury
- Jak na to: Volání přetížené procedury
- Jak na to: Přetížení procedury, která přijímá volitelné parametry
- Jak na to: Přetížit proceduru, která přebírá neomezený počet parametrů
- Zvážení při přetěžování postupů
- přetížení
- Metody rozšíření