"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Virtual/Substitua vs. Novo em C#: Quando devo usar qual palavra -chave para substituir o método?

Virtual/Substitua vs. Novo em C#: Quando devo usar qual palavra -chave para substituir o método?

Postado em 2025-02-06
Navegar:150

Virtual/Override vs. New in C#: When Should I Use Which Keyword for Method Overriding?

virtual/substituir e novas palavras -chave em c#: quando usar qual palavra -chave para reescrever o método?

Ao definir métodos nas classes base, os programadores geralmente enfrentam o problema de usar as palavras -chave "virtual" ou "novas". Essa decisão afeta significativamente o comportamento da reescrita de métodos em classes derivadas.

substituir virtual

use a palavra -chave "virtual" no método da classe base para indicar que ela pode ser substituída na classe derivada. Para substituir o método, a classe derivada deve usar a palavra -chave "substituição". Isso garante que o método substituído funcione conforme o esperado, mantendo a hierarquia e o polimorfismo da herança.

Quando a classe derivada chama um método reescrito, ele executará a versão substituída, mesmo que a variável de referência que mantém o objeto for do tipo de classe base. Isso é chamado de ligação tardia e permite comportamento dinâmico.

nova palavra -chave

Em vez disso, a palavra -chave "nova" no método da classe derivada declara um novo método que oculta métodos herdados com o mesmo nome. Quando usado, o novo método substitui os métodos herdados na classe derivada, destruindo assim o polimorfismo.

Quando a classe derivada chama um método declarado com "novo", ele executa o novo método, independentemente do tipo de variável de referência que mantém o objeto. Isso é considerado a ligação precoce e dificulta o polimorfismo.

Exemplo

Considere o seguinte exemplo de código:

public class Base
{
    public virtual bool DoSomething() { return false; }
}

public class Derived : Base
{
    public new bool DoSomething() { return true; }
}
; Isso destaca a diferença entre a ligação tardia e a ligação precoce.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3