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ênciade chamada 1
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ênciade chamada idêntica 1
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 Shadowsrecomendado na classe derivada; Shadows presumido se nem OverridesShadows especificado2 Overridable ou MustOverride exigido na classe base; Overrides exigido na classe derivada
Herança de elemento de redefinição por classes derivadas de sua classe derivada Elemento de sombreamento herdado por outras classes derivadas; elemento sombreado ainda escondido3 Elemento primordial herdado por outras classes derivadas; elemento substituído ainda substituído

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 você não especificar ou ShadowsOverrides, o compilador emitirá uma mensagem de aviso para ajudá-lo a ter certeza de que tipo de redefinição você deseja 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.

Diretrizes

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.

Consulte também