Promoção de tipo (Visual Basic)
Quando você declara um elemento de programação em um módulo, o Visual Basic promove seu escopo para o namespace que contém o módulo. Isso é conhecido como promoção de tipo.
O exemplo a seguir mostra uma definição de esqueleto de um módulo e dois membros desse módulo.
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
No , projModule
os elementos de programação declarados ao nível do módulo são promovidos a projNamespace
. No exemplo anterior, basicEnum
e innerClass
são promovidos, mas numberSub
não é, porque não é declarado no nível do módulo.
Efeito da Promoção do Tipo
O efeito da promoção de tipo é que uma cadeia de caracteres de qualificação não precisa incluir o nome do módulo. O exemplo a seguir faz duas chamadas para o procedimento no exemplo anterior.
Sub usePromotion()
projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub
No exemplo anterior, a primeira chamada usa cadeias de caracteres de qualificação completas. No entanto, isso não é necessário devido à promoção de tipo. A segunda chamada também acessa os membros do módulo sem incluir projModule
nas cadeias de caracteres de qualificação.
Derrota da Promoção Tipo
Se o namespace já tiver um membro com o mesmo nome de um membro do módulo, a promoção de tipo será derrotada para esse membro do módulo. O exemplo a seguir mostra uma definição de esqueleto de uma enumeração e um módulo dentro do mesmo namespace.
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
No exemplo anterior, o Visual Basic não pode promover a classe abc
para thisNameSpace
porque já existe uma enumeração com o mesmo nome no nível do namespace. Para acessar abcSub
o , você deve usar a cadeia de caracteres de qualificação thisNamespace.thisModule.abc.abcSub
completa. No entanto, a classe xyz
ainda é promovida e você pode acessar xyzSub
com a cadeia de caracteres thisNamespace.xyz.xyzSub
de qualificação mais curta.
Derrota da Promoção de Tipo para Tipos Parciais
Se uma classe ou estrutura dentro de um módulo usar a palavra-chave Parcial, a promoção de tipo será automaticamente derrotada para essa classe ou estrutura, independentemente de o namespace ter ou não um membro com o mesmo nome. Outros elementos do módulo ainda são elegíveis para promoção de tipo.
Consequências. A derrota da promoção de tipo de uma definição parcial pode causar resultados inesperados e até mesmo erros do compilador. O exemplo a seguir mostra definições parciais de esqueleto de uma classe, uma das quais está dentro de um módulo.
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
No exemplo anterior, o desenvolvedor pode esperar que o compilador mescle as duas definições parciais de sampleClass
. No entanto, o compilador não considera promoção para a definição parcial dentro .sampleModule
Como resultado, ele tenta compilar duas classes separadas e distintas, ambas nomeadas sampleClass
, mas com caminhos de qualificação diferentes.
O compilador mescla definições parciais somente quando seus caminhos totalmente qualificados são idênticos.
Recomendações
As recomendações que se seguem representam boas práticas de programação.
Nomes únicos. Quando você tem controle total sobre a nomeação de elementos de programação, é sempre uma boa ideia usar nomes exclusivos em todos os lugares. Nomes idênticos exigem qualificação extra e podem tornar seu código mais difícil de ler. Eles também podem levar a erros sutis e resultados inesperados.
Qualificação Plena. Quando você está trabalhando com módulos e outros elementos no mesmo namespace, a abordagem mais segura é sempre usar a qualificação completa para todos os elementos de programação. Se a promoção de tipo for derrotada para um membro do módulo e você não qualificar totalmente esse membro, poderá acessar inadvertidamente um elemento de programação diferente.