Diferenças entre Sombreamento e Sobrescrição
Quando você define uma classe que herda de uma classe base, você às vezes quer redefinir um ou mais elementos da classe base na classe derivada.Sombreamento e sobrescrição estão disponíveis para esse propósito.
Comparação
É fácil confundir sombreamento com sobrescriçã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.
A seguinte tabela compara sombreamento com sobrescrição.
Ponto de comparação |
Sombreamento |
Substituição |
---|---|---|
Objetivo |
Protege contra uma mudança subsequente na classe base que introduz um membro que você já definiu na classe base. |
Permite polimorfismo através da definição de uma implementação de um procedimento ou propriedade com a mesma sequência de chamada 1. |
Elemento redefinido |
Qualquer tipo de elemento declarado |
Somente um procedimento (Function, Sub, ou Operator) ou propriedade |
Elemento redefinido |
Qualquer tipo de elemento declarado |
Somente um procedimento ou propriedade com uma sequência de chamada idêntica 1 |
Nível de acesso do elemento redefinido |
Qualquer nível de acesso |
Não pode mudar o nível de acesso do elemento sobrescrito |
Legibilidade de gravabilidade do elemento redefinido |
Qualquer combinação |
Não pode mudar a legibilidade ou gravabilidade de propriedades sobrescritas |
Controle da redefinição |
O elemento da classe base não pode forçar ou proibir sombreamento |
Elemnto da classe base pode especificar MustOverride, NotOverridable, ou Overridable |
Uso de palavras chave |
Shadows recomendado na classe derivada, Shadows assumido se Shadows nem Overrides estão especificados 2. |
Overridable ou MustOverride necessário na classe base Overrides necessário na classe derivada |
Herança do elemento redefinido em classes derivadas da classe derivada |
Elememento sombreante herdado por classes derivadas posteriores; elemento sombreado ainda escondido 3 |
Elemento sobrescritor herdado por futuras classes derivadas; elemento sobrescrito ainda sobrescrito |
1 A sequência de chamada consiste do tipo de elemento(Function, Sub, Operator, ou Property), nome, listas de parâmetros e tipo da saída.Você não pode sobrescrever um procedimento com uma propriedade, ou o contrário.Você não pode sobrescrever nenhum tipo de procedimento (Function, Sub, ou Operator) com outro tipo.
2 Se você não especificar ou Shadows ou Overrides, o compilador envia uma mensagem de aviso para ajudá-lo a ter certeza de qual redefinição deseja usar.Se você ignorar o aviso, o mecanismo de sombreamento é usado.
3 Se o elemento sombreador é inacessível numa futura classe derivada, sombreamento não é herdado.Por exemplo, se você declarar o elemento sombreador como Private, uma classe derivando de sua classe derivada herda ou elemento original em vez do elemento sombreador.
Diretrizes
Você normalmente usa sobrescrição nos seguintes casos:
Você está definindo classes derivadas polimórficas.
Você deseja a segurança de fazer o compilador forçar o mesmo tipo de elemento e sequência de chamada.
Você normalmente usa sombreamento nos seguintes casos:
Você antecipa que sua classe base pode ser modificada e definir um elemento usando o mesmo nome que o seu.
Você deseja a liberdade de mudar o tipo de elemento ou sequência de chamada.
Consulte também
Tarefas
Como: Distinguir entre dois elementos com o mesmo nome
Como: Ocultar uma variável com o mesmo nome sistema autônomo a variável
Como: Ocultar uma variável herdada
Como: Acessar uma variável oculto por uma classe derivada
Conceitos
Resolvendo uma Referência Quando Várias Variáveis Têm o Mesmo Nome