Olá pessoas lindas,
Partiu último desafio...
Pra resolver esse problema primeiramente vamos para abstração.
- Sabemos que todos os funcionários devem ter bonificação.
- E cada tipo de funcionário tem sua própria regra de negócio.
[ ] - Construir a interface e organizar o código
[ ] - Aplicar a interface para todos os funcionários
[ ] - Implementar o método Bonificar()
Com isso em mente removemos a prop Bonificacao, ele será transformado em método.
Vamos começar atacando a Interface, nesse atual ponto temos também uma outra interface IAutenticavel, para deixar nosso código mais organizado, criei um diretório chamado interfaces, movi o IAutenticavel, e ajustei suas importações. Criei uma nova interface chamado IBonificacao, ficando assim:
Como as regras de negócio da bonificação é diferente para cada tipo de cargo entre os funcionários, então deve ser implementada por quem a utiliza.
IBonificacao.cs
public interface IBonificacao
{
public double Bonificar();
}
[x] - Construir a interface e organizar o código
Vamos agora disponibilizar a bonificação para todos os funcionários, e para isso na classe Funcionario.cs, fazer o uso da interface IBonificacao.cs
Funcionario.cs
public abstract class Funcionario : IBonificacao
{
public static int TotalDeFuncionarios { get; private set; }
public string Nome { get; private set; }
public string Cpf { get; private set; }
public double Salario { get; protected set; }
protected Funcionario(string nome, string cpf, double salario)
{
this.Nome = nome;
this.Cpf = cpf;
this.Salario = salario;
TotalDeFuncionarios++;
}
public abstract void AumentarSalario();
public void MostrarFuncionario()
{
System.Console.WriteLine($"Nome: {this.Nome}");
System.Console.WriteLine($"CPF: {this.Cpf}");
System.Console.WriteLine($"Salário: {this.Salario.ToString("C")}");
}
public abstract double Bonificar();
}
Reparem que dessa forma temos que possuir o método Bonificar(), mas não somos obrigado a implementar, pois essa é uma classe abstrata, não faz sentido criar uma lógica ou regra de negócio para algo que nunca sairá do papel.
[x] - Aplicar a interface para todos os funcionários
Agora esta fácil, pois uma vez que qualquer classe herdar de funcionário ela será obrigada a implementar o método Bonificar();
Auxiliar.cs
public class Auxiliar : Funcionario, IBonificacao
{
public Auxiliar(string nome, string cpf) : base(nome, cpf, 2000) { }
public override void AumentarSalario() => this.Salario *= 1.1;
public override double Bonificar() => this.Salario *= 1.2;
}
Designer.cs
public class Designer : Funcionario
{
public Designer(string nome, string cpf) : base(nome, cpf, 3000) { }
public override void AumentarSalario() => this.Salario *= 1.11;
public override double Bonificar() => this.Salario *= 1.17;
}
Diretor.cs
public class Diretor : FuncionarioAutenticavel
{
public Diretor(string nome, string cpf) : base(nome, cpf, 5000) { }
public override void AumentarSalario() => this.Salario *= 1.15;
public override double Bonificar() => this.Salario *= 1.5;
}
GerenteDeContas.cs
public class GerenteDeContas : FuncionarioAutenticavel
{
public GerenteDeContas(string nome, string cpf) : base(nome, cpf, 4000) { }
public override void AumentarSalario() => this.Salario *= 1.05;
public override double Bonificar() => this.Salario *= 1.25;
}
Dessa forma, caso algum dia venha a existir outros cargos dentro da empresa, basta implementar o método da interface IBonificar, e caso alguma norma mude em relação a bonificação, basta alterar apenas o local da mudança, sem afetar outras partes do código que não sofrerão alterações.
[x] - Implementar o método Bonificar()