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

Quando você define uma classe que herda de uma classe base, às vezes você deseja redefinir um ou mais dos elementos de classe base na classe derivada. O sombreamento e a substituição estão disponíveis para essa finalidade.

Comparação

Sombreamento e substituição são usados quando uma classe derivada herda de uma classe base e redefine 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
Finalidade Protege contra uma modificação subsequente da classe base que introduz um membro que você já definiu em sua classe derivada Obtém o polimorfismo definindo uma implementação diferente de um procedimento ou propriedade com a mesma sequênciade chamadas 1
Elemento redefinido Qualquer tipo de elemento declarado Somente um procedimento (Function, Subou Operator) ou uma propriedade
Redefinindo elemento Qualquer tipo de elemento declarado Somente um procedimento ou propriedade com a sequência de chamadasidê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 capacidade de gravação do elemento de redefinição Qualquer combinação Não é possível alterar a legibilidade ou a capacidade de gravação da propriedade substituída
Controle sobre a redefinição O elemento de classe base não pode impor ou proibir sombreamento O elemento de classe base pode especificar MustOverride, NotOverridableou Overridable
Uso de palavra-chave Shadowsrecomendado na classe derivada; Shadows assumido se nem Shadows especificado Overrides2 Overridable ou MustOverride necessário na classe base; Overrides obrigatório na classe derivada
Herança de redefinir elemento por classes derivadas de sua classe derivada Elemento shadowing herdado por classes derivadas adicionais; elemento sombreado ainda oculto3 Elemento de substituição herdado por classes derivadas adicionais; elemento substituído ainda substituído

1 A sequência de chamadas consiste no tipo de elemento (Function, Sub, Operator ou Property), nome, lista de parâmetros e tipo de retorno. Você não pode substituir um procedimento com uma propriedade ou o contrário. Você não pode substituir um tipo de procedimento (Function, Sub ou Operator) por outro tipo.

2 Se você não especificar Shadows ou Overrides, o compilador emitirá uma mensagem de aviso para ajudá-lo a ter certeza de qual 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 classe derivada adicional, 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, você usa substituição nos seguintes casos:

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

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

Normalmente, você usa sombreamento nos seguintes casos:

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

  • Você deseja a liberdade de alterar o tipo de elemento ou a sequência de chamadas.

Confira também