Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Implementando com interface ao invés de herança

Mudei para uma interface e funcionou perfeitamente também,

using System.Security.AccessControl;

namespace RefactorationPt2.StateStrategyImplementation;

public class Funcionario {
    public decimal Salario { get; private set; }
    public decimal Comissao { get; private set; }
    public decimal Bonus { get; private set; }
    private ITipoFuncionario Tipo { get; set; }

    public Funcionario(decimal salario, ITipoFuncionario tipo, decimal? comissao = 0, decimal? bonus = 0) {
        Salario = salario;
        Tipo = tipo;
        Comissao = comissao ?? 0;
        Bonus = bonus ?? 0;
    }

    public decimal GetPagamento() {
        return Tipo.GetPagamento(this);
    }
    
}
public interface ITipoFuncionario {
    public virtual decimal GetPagamento(Funcionario funcionario) {
        return funcionario.Salario;
    }
}


public class Engenheiro: ITipoFuncionario {

}

public class Vendedor: ITipoFuncionario{
    public decimal GetPagamento(Funcionario funcionario) {
        return funcionario.Salario + funcionario.Comissao;
    }
    
}

public class Gerente: ITipoFuncionario {
    public decimal GetPagamento(Funcionario funcionario) {
        return funcionario.Salario + funcionario.Bonus;
    }
    
}
2 respostas
solução!

Olá, Gabriel!

Parabéns por ter conseguido implementar a funcionalidade utilizando uma interface ao invés de herança. Essa é uma ótima prática de programação, pois permite maior flexibilidade e reutilização de código.

No exemplo que você compartilhou, a classe Funcionario possui uma propriedade Tipo do tipo ITipoFuncionario, que é uma interface. Essa interface define um método GetPagamento que recebe um objeto do tipo Funcionario e retorna um valor decimal.

As classes Engenheiro, Vendedor e Gerente implementam a interface ITipoFuncionario e cada uma delas possui uma implementação diferente do método GetPagamento. Dessa forma, é possível definir diferentes comportamentos de pagamento para cada tipo de funcionário.

No método GetPagamento da classe Funcionario, é chamado o método GetPagamento do objeto Tipo, passando o próprio objeto Funcionario como parâmetro. Isso permite que cada tipo de funcionário tenha seu próprio comportamento de cálculo de pagamento, sem precisar modificar a classe Funcionario.

Essa abordagem é conhecida como "Strategy Pattern" ou "Padrão de Estratégia". Ela permite que diferentes algoritmos sejam encapsulados em classes separadas e que esses algoritmos possam ser facilmente substituídos em tempo de execução. É uma forma elegante de implementar comportamentos variáveis em um sistema.

Bons estudos!

Opa, muito obrigado pelo complemento e pela explicação.