Diferença chave: Métodos abstratos são os métodos que são declarados, mas não possuem nenhuma implementação. Métodos virtuais são usados para uma implementação do polimorfismo baseado em tipo. A classe derivada tem a flexibilidade de reimplementar o método virtual da classe base usando a palavra-chave 'override'.
Por exemplo -
classe abstrata pública exampleAbstractClass
{
public abstract void exampleabstractMethod ();
public virtual void nonAbstractMethod ()
{
Console.WriteLine ("Implementação é definida no método");
}
class normalNonAbstractClass: exampleAbstractClass
{
substituição pública void exampleabstractMethod ()
{
Console.WriteLine ("Overriding the exampleabstractMethod da classe exampleAbstractClass");
}
}
base da classe
{
Teste void virtual público ()
{
Console.WriteLine ("Base.Test");
}
}
class Derived: Base
{
substituição pública void Test ()
{
Console.WriteLine ("Derived.Test");
}
}
Métodos virtuais são usados para uma implementação do polimorfismo baseado em tipo. A classe derivada tem a flexibilidade de reimplementar o método virtual da classe base usando a palavra-chave override. O virtual e o abstrato não podem ser usados junto com modificadores estáticos ou virtuais ou de substituição.
Comparação entre o Método Virtual e o Abstract:
Método Virtual | Método abstrato | |
Definição | Métodos virtuais são usados para uma implementação do polimorfismo baseado em tipo. | Métodos abstratos são os métodos que são declarados, mas não possuem nenhuma implementação. |
Implementação | Sim, pode ter implementação | Não, não pode ter nenhuma implementação |
Precisa ser substituído | Não é obrigatória | Obrigatório |
Palavra-chave usada para distingui-lo de outros tipos de métodos | Virtual | Abstrato |
Classe | Classe contendo o método virtual pode ser instanciada. | Classe contendo método abstrato não pode ser instanciada. Só pode ser herdado. |
Escopo | Escopo do método virtual apenas para membros. | Escopo do método abstrato para membros e classes. |
Método a ser executado (tipo de classe base-objeto) | A implementação pai será chamada apenas no caso em que nenhuma implementação é fornecida na classe concreta. | Implementação concreta |
Método a ser executado (tipo de classe objeto concreto) | Implementação concreta | Implementação concreta |