1
resposta

Faça como eu fiz: relatório de funcionários

Program.cs

Funcionario gerente = new Gerente();
Funcionario desenvolvedor = new Desenvolvedor();

string respostaGerente = gerente.GerarRelatorio();
string respostaDesenvolvedor = desenvolvedor.GerarRelatorio();

Console.WriteLine(respostaGerente);
Console.WriteLine(respostaDesenvolvedor);

Funcionario.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Alura_exercicios_poo
{
    public class Funcionario
    {
        public virtual string GerarRelatorio()
        {
            return "Relatório de Funcionário";
        }
    }
}

Gerente.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Alura_exercicios_poo
{
    public class Gerente : Funcionario
    {
        public override string GerarRelatorio()
        {
            return "Relatório de Gerente";
        }

    }
}

Desenvolvedor.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Alura_exercicios_poo
{
    public class Desenvolvedor : Funcionario
    {
        public override string GerarRelatorio()
        {
            return "Relatório de Desenvolvedor";
        }
    }
}

Deixa eu ver se entendi , a palavra reservada abstract é se eu nao tiver nenhum corpo no meu metodo e o virtual é para se eu tiver um corpo do meu metodo ?

1 resposta

Oi, Horizon! Como vai?

A palavra abstract é usada quando você obriga que as classes filhas implementem o método, ou seja, o método não tem corpo na classe base. Já a palavra virtual é usada quando você fornece uma implementação padrão, mas ainda permite que as subclasses sobrescrevam se quiserem.

Esse exemplo vai deixar isso mais claro:


// Classe base com método abstrato (sem corpo)
public abstract class Funcionario {
    public abstract string GerarRelatorio();
}

// Classe derivada é OBRIGADA a implementar
public class Gerente : Funcionario {
    public override string GerarRelatorio() {
        return "Relatorio de Gerente";
    }
}

Acima, usamos abstract. Agora veja com virtual:


// Classe base com método virtual (tem corpo)
public class Funcionario {
    public virtual string GerarRelatorio() {
        return "Relatorio generico";
    }
}

// Classe derivada PODE sobrescrever
public class Desenvolvedor : Funcionario {
    public override string GerarRelatorio() {
        return "Relatorio de Desenvolvedor";
    }
}
  • Com abstract: não tem corpo, é obrigatório sobrescrever.
  • Com virtual: tem corpo, sobrescrever é opcional.

Espero ter ajudado.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!