4
respostas

Dúvida sobre um método VIRTUAL x método ABSTRACT

Olá!

No curso de C# parte 3 - Aula 3, o instrutor Guilherme nos ensina que se quisermos que seja obrigatória a implementação de um método, devemos colocá-lo com ABSTRACT.

No meu ponto de vista, praticamente em todas as situações vão exigir que os métodos da classe base (abstrata) sejam implementados nas classes derivadas.

Diante disso, não estou conseguindo enxergar a utilidade de um método VIRTUAL. Em que situações ele é mais adequado?

Agradeço muito se puderem me ajudar!

Abraços

4 respostas

Olá Fabio, tudo bem?

A definição dos métodos ABSTRACT está correta! É isso mesmo!

O método VIRTUAL você usa quando o método pode ser sobrescrito, diferente do abstract, que impõe à classe filha que deve escrever a implementação daquele método.

Porém um detalhe importante, métodos abstratos somente podem ser adicionados a classes abstratas também.

Vou te dar um exemplo de uma classe base de banco:

public abstract class BaseDBObject
{
   public int ID { get; set; }

   public bool IsDeleted { get; set; }

   public virtual void OnConfiguring() //Chamado quando faz a configuração do banco
   {
      //Faz a configuração do ID e IsDeleted.

      //Como é virtual, caso a classe filha não implemente nenhuma configuração específica de banco, não precisa sobrescrever esse método.
   }

    public abstract void OnSave();
    //Aqui não há implementação do método OnSave, pois quem fará isso será a classe que herdar.
}

Espero ter ajudado, se ainda ficar em dúvida, pode perguntar!

Abraços.

Acho que entendi... Com abstract, quem herda é obrigado a implementar o método. Com virtual, a classe base não é obrigada a fazer uma implementação. Se não implementar, vai usar a implementação padrão da classe base. É isso?

Olá Fabio.

Exatamente isso!

E apenas acrescentando, quem implementar o método virtual pode ainda usar a implementação da classe base.

Seguindo a mesma linha do meu exemplo:

public class SomeDbObject : BaseDBObject
{
  public override void OnConfiguring()
   {
      base.OnConfiguring();

      //Dessa forma, ao chamar esse método, primeiro irá executar o método na classe base, e depois qualquer coisa eu adicionar aqui.
      //Poderia ter adicionado a chamada ao base, ao invés de antes de tudo, depois também:
      //base.OnConfiguring();
   }
}

Olá Fabio, tudo bem?

Ficou com alguma duvida ainda?

Se deu tudo certo, por favor, só peço para marcar a minha resposta então como solução, assim a Alura encerra o tópico.

E dessa forma também, caso alguém tenha uma dúvida parecida com a sua, poderá ver que há uma solução e deu certo para alguém.

:)