Diferenças entre sombreamento e substituição (Visual Basic)
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ênciade chamada 1 |
Elemento redefinido | Qualquer tipo de elemento declarado | Apenas um procedimento (Function , Sub ou Operator ) ou propriedade |
Redefinindo o elemento | Qualquer tipo de elemento declarado | Apenas um procedimento ou propriedade com a sequênciade chamada idê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 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 , NotOverridable ou Overridable |
Utilização de palavras-chave | Shadows recomendado na classe derivada; Shadows presumido se nem Overrides Shadows especificado2 |
Overridable ou MustOverride exigido na classe base; Overrides exigido na classe derivada |
Herança de elemento de redefinição por classes derivadas de sua classe derivada | Elemento de sombreamento herdado por outras classes derivadas; elemento sombreado ainda escondido3 | Elemento primordial herdado por outras classes derivadas; elemento substituído ainda substituído |
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
, Sub
ou Operator
) por outro tipo.
2 Se você não especificar ou Shadows
Overrides
, o compilador emitirá uma mensagem de aviso para ajudá-lo a ter certeza de que 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 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.
Diretrizes
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.