Partilhar via


Diferenças entre sombreamento e substituição (Visual Basic)

Quando você define uma classe que herda de uma classe base, às vezes deseja redefinir um ou mais dos elementos da classe base na classe derivada. Sombreamento e sobreposição estão disponíveis para este fim.

Comparação

Sombreamento e substituição são usados quando uma classe derivada herda de uma classe base, e ambos redefinem um elemento declarado com outro. Mas há diferenças significativas entre os dois.

A tabela a seguir compara sombreamento com substituição.

Ponto de comparação Sombreamento Substituição
Propósito Protege contra uma modificação de classe base subsequente que introduz um membro que você já definiu em sua classe derivada Atinge o polimorfismo definindo uma implementação diferente de um procedimento ou propriedade com a mesma sequência de chamada1
Elemento redefinido Qualquer tipo de elemento declarado Apenas um procedimento (Function, Subou Operator) ou propriedade
Redefinindo o elemento Qualquer tipo de elemento declarado Apenas um procedimento ou propriedade com a sequência de chamada idêntica1
Nível de acesso do elemento de redefinição Qualquer nível de acesso Não é possível alterar o nível de acesso do elemento substituído
Legibilidade e gravabilidade do elemento de redefinição Qualquer combinação Não é possível alterar a legibilidade ou a gravabilidade da propriedade substituída
Controlo sobre a redefinição O elemento de classe base não pode impor ou proibir o sombreamento O elemento de classe base pode especificar MustOverride, NotOverridableou Overridable
Utilização de palavras-chave Shadows recomendado na classe derivada; Shadows assumido se nem Shadows nem Overrides especificado2 Overridable ou MustOverride exigido na classe base; Overrides exigido na classe derivada
Herança de elemento redefinido por classes derivadas da sua classe derivada Elemento de sombreamento herdado por outras classes derivadas; elemento sombreado ainda escondido3 Elemento sobrescrito herdado por classes derivadas adicionais; elemento sobrescrito permanece sobrescrito

1 A sequência de chamada consiste no tipo de elemento (Function, Sub, Operator, ou Property), nome, lista de parâmetros e tipo de retorno. Não é possível substituir um procedimento por uma propriedade ou o contrário. Não é possível substituir um tipo de procedimento (Function, Subou Operator) por outro tipo.

2 Se não especificar Shadows nem Overrides, o compilador emitirá uma mensagem de aviso para ajudar a assegurar-se de que tipo de redefinição pretende usar. Se você ignorar o aviso, o mecanismo de sombreamento será usado.

3 Se o elemento de sombreamento estiver inacessível em uma outra classe derivada, o sombreamento não será herdado. Por exemplo, se você declarar o elemento de sombreamento como Private, uma classe derivada de sua classe derivada herdará o elemento original em vez do elemento de sombreamento.

Orientações

Normalmente, utiliza a substituição nos seguintes casos:

  • Você está definindo classes derivadas polimórficas.

  • Você quer a segurança de fazer com que o compilador imponha o tipo de elemento idêntico e a sequência de chamada.

Normalmente, você usa sombreamento nos seguintes casos:

  • Você antecipa que sua classe base pode ser modificada e define um elemento usando o mesmo nome que o seu.

  • Você quer a liberdade de alterar o tipo de elemento ou a sequência de chamada.

Ver também