Para esse tipo de situação, era possível a implementação de um método virtual genérico ou apenas a assinatura do método em uma classe abstrata que pudesse ser sobrescrita. Para ambos os casos, nesse problema específico, a resposta seria a mesma.
Program.cs
using RH.Modelos;
Funcionario f1 = new Gerente("Organização estrutural das tarefas da equipe.");
Funcionario f2 = new Desenvolvedor("Criação da interface do site.");
Console.Clear();
Console.WriteLine(f1.GerarRelatorio());
Console.WriteLine(f2.GerarRelatorio());
Funcionario.cs
namespace RH.Modelos;
abstract class Funcionario {
public abstract string GerarRelatorio();
}
ou
Funcionario.cs
namespace RH.Modelos;
class Funcionario {
public virtual string GerarRelatorio() {
return "relatorio genérico";
}
}
Gerente.cs
namespace RH.Modelos;
class Gerente : Funcionario {
public string? relatorio {get;}
public Gerente(string? relatorio) {
this.relatorio = relatorio;
}
public override string GerarRelatorio() {
return $"Relatório do Gerente: {relatorio}";
}
}
Desenvolvedor.cs
namespace RH.Modelos;
class Desenvolvedor : Funcionario {
public string? relatorio {get;}
public Desenvolvedor(string? relatorio) {
this.relatorio = relatorio;
}
public override string GerarRelatorio() {
return $"Relatório do Dev: {relatorio}";
}
}