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

Método GetBonificacao() da classe Diretor retorna mesma regra de negócio da classe Funcionário

Não importa o que eu coloque no retorno do método GetBonificacao() da classe Diretor, o retorno sempre acompanha a regra de negócio da classe Funcionário. Também dá o seguinte erro, pedindo para colocar new, antes de "double", em public double GetBonificacao():

C:\Users\juuam\Documents\Dev\Alura\CSharp\DotNetCore\ByteBank\Funcionarios\Diretor.cs(7,23): warning CS0108: 
"Diretor.GetBonificacao()" oculta o membro herdado "Funcionario.GetBonificacao()". 
Use a nova palavra-chave se foi pretendido ocultar. 
[C:\Users\juuam\Documents\Dev\Alura\CSharp\DotNetCore\ByteBank\ByteBank.csproj]

Segue o código:

// ByteBank > Funcionarios > Diretor.cs

using System;

namespace ByteBank.Funcionarios
{
    public class Diretor : Funcionario
    {
        public double GetBonificacao()
        {
            return Salario;
        }
    }
}
// ByteBank > Funcionarios > Funcionario.cs

using System;

namespace ByteBank.Funcionarios
{
    public class Funcionario
    {
        public string Nome { get; set; }
        public string CPF { get; set; }
        public double Salario { get; set; }

        public double GetBonificacao()
        {
            return Salario * 0.1;
        }    
    }
}
// ByteBank > Funcionarios > GerenciadorBonificacao.cs

using System;

namespace ByteBank.Funcionarios
{
    public class GerenciadorBonificacao
    {
        private double _totalBonificacao;

        public void Registrar(Funcionario funcionario)
        {
            _totalBonificacao += funcionario.GetBonificacao();
        }

        public double GetTotalBonificacao() {
            return _totalBonificacao;
        }
    }
}
/// ByteBank > Program.cs

using System;
using ByteBank.Funcionarios;

class Program
{
    static void Main(string[] args)
    {
        Funcionario carlos = new Funcionario();
        carlos.Nome = "Carlos";
        carlos.CPF = "123.123.123-12";
        carlos.Salario = 500;

        Funcionario roberta = new Funcionario();
        roberta.Nome = "Roberta";
        roberta.CPF = "456.456.456.45";
        roberta.Salario = 2000;

        GerenciadorBonificacao gerenciador = new GerenciadorBonificacao();

        gerenciador.Registrar(carlos);
        gerenciador.Registrar(roberta);

        Console.WriteLine(gerenciador.GetTotalBonificacao());
        Console.WriteLine(roberta.GetBonificacao());

        Console.Read();
    }
}

O que eu estou fazendo de errado?

2 respostas

Acho que o problema está em você criar um double com o mesmo nome...

A Classe do Funcionário tem um public double GetBonificacao, mas a classe Diretor também tem um public double GetBonificacao

Nesse caso, você terá que trocar: Na classe do funcionário: Trocar public double GetBonificacao por public virtual double GetBonificacao, Na classe do diretor: Trocar public double GetBonificacao por public override double GetBonificacao

Aqui a documentação oficial da Microsoft: https://docs.microsoft.com/pt-br/dotnet/csharp/language-reference/keywords/override Aqui uma aula do curso explicando: https://cursos.alura.com.br/course/csharp-parte-3-heranca-interfaces-polimorfismo/task/39770

solução!

Eu estava instanciando os dois objetos como o tipo Funcionario objeto = new Funcionario() e nenhum como o tipo Diretor, então nunca ia ver o método da classe Diretor em ação mesmo... Erro meu, foi mau.Corrigido e funcionando perfeitamente.