Sombreamento em Visual Basic
Quando dois elementos de programação compartilham o mesmo nome, um deles pode ocultar, ou Sombrear , o outro.Em uma situação assim, o elemento sombreado não está disponível para referência; em vez disso, quando seu código usa o nome do elemento, o compilador Visual Basic resolva para o elemento sombreado.
Objetivo
O objetivo principal do sombreamento é proteger a definição de seus membros de classe.A classe base pode passar por uma mudança que cria um elemento com o mesmo nome que o daquele que você já definiu.Se isto acontecer, o modificador Shadows obriga referências através da sua classe a serem resolvidas ao membro que você definiu, em vez de ser ao novo elemento da classe base.
Tipos de sombreamento
Um elemento pode sombrear outro elemento de duas maneiras diferentes.O elemento de sombreamento pode ser declarado dentro uma sub-região da região que contém o elemento sombreado, nesse caso o sombreamento é realizado através de escopo .Ou uma classe derivada pode redefinir um membro de um classe base, em que o sombreamento é feito através de herança .
Sombreamento pelo escopo
É possível para elementos de programação no mesmo módulo, de classe ou estrutura ter o mesmo nome mas escopo diferente.Quando dois elementos são declarados dessa maneira e o código refere-se ao nome que eles compartilham, o elemento com o escopo mais estreito as sombreia o outro elemento (escopo de bloco é o menor).
Por exemplo, um módulo pode definir uma variável Public chamada temp, e um procedimento dentro do módulo pode declarar uma variável local também denominada temp.Referências a temp de dentro do procedimento acessam a variável local, enquanto referências a variável temp de fora do procedimento acessam a variável Public.Nesse caso, a variável de procedimento temp sombreia a variável de módulo temp.
A ilustração a seguir mostra duas variáveis, ambas chamadas temp.A variável local temp sombreia a variável de membro temp quando acessada a partir de seu próprio procedimento p.No entanto, a palavra-chave MyClass ignora o sombreamento e acessa o variável de membro.
Sombreamento através do escopo
Para obter um exemplo de sombreamento através de escopo, consulte Como: Ocultar uma variável com o mesmo nome sistema autônomo a variável.
Sombreamento através de herança
Se uma classe derivada redefine um elemento de programação herdado de uma classe base, o elemento que está sendo redefinido sombreia o elemento original.Você pode sombrear qualquer tipo de elemento declarado, ou conjunto de elementos sobrecarregados, com qualquer outro tipo.Por exemplo, uma variável Integer pode sombrear um procedimento Function.Se você sombrear um procedimento com outro procedimento, você pode usar uma lista de parâmetros e um tipo de retorno diferente.
O seguinte exemplo mostra uma classe base b e um classe derivada d que herda de b.A classe base define um procedimento denominado proc, e a classe derivada o sombreia com outro procedimento de mesmo nome.A primeira declaração Call acessa o sombreamento proc na classe derivada.No entanto, a palavra-chave MyBase ignora o sombreamento e acessa o procedimento sombreado na classe base.
Sombreamento através de herança
Para obter um exemplo de sombreamento por meio de herança, consulte Como: Ocultar uma variável com o mesmo nome sistema autônomo a variável e Como: Ocultar uma variável herdada.
Sombreamento e nível de acesso
O elemento de sombreamento nem sempre está acessível a partir do código usando a classe derivada.Por exemplo, ele pode ser declarado como Private.Em tais casos, o sombreamento é desfeito e o compilador resolve qualquer referência ao mesmo elemento que ele teria se tivesse sido sombreado.Esse elemento é o elemento acessível com o menor número de etapas derivacionais para trás da classe de sombreamento.Se o elemento sombreado é um procedimento, a resolução é a versão mais acessível com o mesmo nome, lista de parâmetros e tipo de retorno.
O exemplo a seguir mostra uma hierarquia de herança de três classes.Cada classe define um procedimento Subdisplay,e cada classe derivada sombreia o procedimento display na sua classe base.
Public Class firstClass
Public Sub display()
MsgBox("This is firstClass")
End Sub
End Class
Public Class secondClass
Inherits firstClass
Private Shadows Sub display()
MsgBox("This is secondClass")
End Sub
End Class
Public Class thirdClass
Inherits secondClass
Public Shadows Sub display()
MsgBox("This is thirdClass")
End Sub
End Class
Module callDisplay
Dim first As New firstClass
Dim second As New secondClass
Dim third As New thirdClass
Public Sub callDisplayProcedures()
' The following statement displays "This is firstClass".
first.display()
' The following statement displays "This is firstClass".
second.display()
' The following statement displays "This is thirdClass".
third.display()
End Sub
End Module
No exemplo anterior, a classe derivada secondClass sombreia display com um procedimento Private .Quando o módulo callDisplay chama display na secondClass, o código de chamada está fora da secondClass e, portanto, não é possível acessar o procedimento privado display.pSombreamento é desfeito, e o compilador resolve a referência para o procedimento da classe base display .
No entanto, a classe derivada adicional thirdClass declara display como Public,para que o código callDisplay possa acessá-lo.
Sombreamento e Substituição.
Não confunda sombreamento com substituição.Os dois são usados quando uma classe derivada herda de uma classe base, e os dois redefinem um elemento declarado com outro.Mas existem diferenças significantes entre os dois.Para uma comparação, consulte Diferenças entre Sombreamento e Sobrescrição.
Sombreamento e Sobrecarregamento.
Se você sombreia o mesmo elemento da classe base com mais de um elemento na sua classe derivada, os elementos de sombreamento se tornarão versões sobrecarregadas desse elemento.Para obter mais informações, consulte Sobrecarga de procedimento.
Acessando um elemento sombreado
Quando você acessa um elemento de uma classe derivada, você normalmente o faz até a instância atual da classe derivada, definindo o nome do elemento com a palavra-chaveMe.Se sua classe derivada sombreia o elemento na classe base, você pode acessar o elemento da classe base usando a palavra-chave MyBase.
Para obter um exemplo de acesso a um elemento sombreado, consulte Como: Acessar uma variável oculto por uma classe derivada.
Declaração de variável de objeto
O modo como você cria a variável de objeto também pode afetar se a classe derivada acessa um elemento de sombreamento ou o elemento sombreado.O exemplo a seguir cria dois objetos de uma classe derivada, mas um objeto é declarado como a classe base e o outro como a classe derivada.
Public Class baseCls
' The following statement declares the element that is to be shadowed.
Public z As Integer = 100
End Class
Public Class dervCls
Inherits baseCls
' The following statement declares the shadowing element.
Public Shadows z As String = "*"
End Class
Public Class useClasses
' The following statement creates the object declared as the base class.
Dim basObj As baseCls = New dervCls()
' Note that dervCls widens to its base class baseCls.
' The following statement creates the object declared as the derived class.
Dim derObj As dervCls = New dervCls()
Public Sub showZ()
' The following statement outputs 100 (the shadowed element).
MsgBox("Accessed through base class: " & basObj.z)
' The following statement outputs "*" (the shadowing element).
MsgBox("Accessed through derived class: " & derObj.z)
End Sub
End Class
No exemplo anterior, a variável basObj é declarada como a classe base.Atribuir um objeto dervCls a ela constitui uma conversão de ampliação e, portanto, é válida.No entanto, a classe base não pode acessar a versão de sombreamento da variável z na classe derivada, então o compilador resolve basObj.z para o valor original da classe base.
Consulte também
Conceitos
Conversões Ampliadoras e Redutoras