Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 |
|---|---|---|
| Propósito | Protege contra uma modificação de classe base subsequente 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ência de chamadas1 |
| Elemento redefinido | Qualquer tipo de elemento declarado | Somente um procedimento (Function, Subou Operator) ou 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 gravabilidade 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 |
Shadows recomendado na classe derivada; Shadows assumido se Shadows nem Overrides for especificado2 |
Overridable ou MustOverride necessário na classe base; Overrides necessário na classe derivada |
| Herança de redefinir elemento por classes derivadas de sua classe derivada | Elemento de sombreamento 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, , SubOperatorou Property), nome, lista de parâmetros e tipo de retorno. Você não pode substituir um procedimento com uma propriedade ou o contrário. Não é possível substituir um tipo de procedimento (Functionou SubOperator) por outro tipo.
2 Se você não especificar nem Shadows nem Overrides, o compilador emitirá uma mensagem de aviso para ajudá-lo a determinar qual tipo de redefinição 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.