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 , Sub ou 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 , NotOverridable ou Overridable |
Uso de palavra-chave | Shadows recomendado na classe derivada; Shadows assumido se nem Shadows especificado Overrides 2 |
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.