Propagace typu (Visual Basic)
Když deklarujete programovací prvek v modulu, Jazyk Visual Basic propaguje jeho obor na obor názvů obsahující modul. To se označuje jako povýšení typu.
Následující příklad ukazuje definici kostry modulu a dva členy tohoto modulu.
Namespace projNamespace
Module projModule
Public Enum basicEnum As Integer
one = 1
two = 2
End Enum
Public Class innerClass
Shared Sub numberSub(ByVal firstArg As Integer)
End Sub
End Class
End Module
End Namespace
V projModule
rámci , programovací prvky deklarované na úrovni modulu jsou povýšeny na projNamespace
. V předchozím příkladu basicEnum
a innerClass
jsou povýšeny, ale numberSub
nejsou, protože nejsou deklarovány na úrovni modulu.
Účinek povýšení typu
Účinek povýšení typu spočívá v tom, že řetězec kvalifikace nemusí obsahovat název modulu. Následující příklad provede dvě volání procedury v předchozím příkladu.
Sub usePromotion()
projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub
V předchozím příkladu první volání používá kompletní řetězce kvalifikace. To ale není nutné kvůli povýšení typu. Druhé volání také přistupuje ke členům modulu bez zahrnutí projModule
do řetězců kvalifikace.
Porážka typu Povýšení
Pokud obor názvů již má člena se stejným názvem jako člen modulu, povýšení typu je pro daného člena modulu poraženo. Následující příklad ukazuje definici kostry výčtu a modulu ve stejném oboru názvů.
Namespace thisNamespace
Public Enum abc
first = 1
second
End Enum
Module thisModule
Public Class abc
Public Sub abcSub()
End Sub
End Class
Public Class xyz
Public Sub xyzSub()
End Sub
End Class
End Module
End Namespace
V předchozím příkladu visual Basic nemůže zvýšit úroveň třídy abc
thisNameSpace
, protože již existuje výčet se stejným názvem na úrovni oboru názvů. Chcete-li získat přístup abcSub
, je nutné použít úplný řetězec thisNamespace.thisModule.abc.abcSub
kvalifikace . Třída xyz
je však stále povýšena a můžete získat přístup s xyzSub
kratším řetězcem thisNamespace.xyz.xyzSub
kvalifikace .
Porážka povýšení typu pro částečné typy
Pokud třída nebo struktura uvnitř modulu používá částečné klíčové slovo, povýšení typu je automaticky poraženo pro danou třídu nebo strukturu, zda obor názvů má člena se stejným názvem. Další prvky v modulu mají stále nárok na povýšení typu.
Důsledky. Porážka povýšení typu částečné definice může způsobit neočekávané výsledky a dokonce chyby kompilátoru. Následující příklad ukazuje kostru částečných definic třídy, z nichž jedna je uvnitř modulu.
Namespace sampleNamespace
Partial Public Class sampleClass
Public Sub sub1()
End Sub
End Class
Module sampleModule
Partial Public Class sampleClass
Public Sub sub2()
End Sub
End Class
End Module
End Namespace
V předchozím příkladu může vývojář očekávat, že kompilátor sloučí dvě částečné definice sampleClass
. Kompilátor však nepovažuje povýšení pro částečnou definici uvnitř sampleModule
. V důsledku toho se pokusí zkompilovat dvě samostatné a odlišné třídy, a to jak pojmenované sampleClass
, tak s různými cestami kvalifikace.
Kompilátor sloučí částečné definice pouze v případě, že jsou jejich plně kvalifikované cesty identické.
Doporučení
Následující doporučení představují dobrý postup programování.
Jedinečné názvy Pokud máte plnou kontrolu nad pojmenováváním programovacích prvků, je vždy vhodné používat jedinečné názvy všude. Identické názvy vyžadují dodatečnou kvalifikaci a mohou znesnadnit čtení kódu. Můžou také vést k drobným chybám a neočekávaným výsledkům.
Úplná kvalifikace. Při práci s moduly a dalšími prvky ve stejném oboru názvů je nejbezpečnějším přístupem vždy používat úplnou kvalifikaci pro všechny programovací prvky. Pokud je povýšení typu pro člena modulu poraženo a vy tento člen plně nekvalifikujete, můžete neúmyslně přistupovat k jinému programovacímu prvku.