Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.