Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Classe base e classe derivada, ambos com métodos descritos e sem Override/Virtual

Boa tarde.

Não entendi a explicação da atividade, e ao escrever o exemplo e chamar ambos os métodos para Diretor e Funcionário, o resultado foi 1.

Pelo que entendi, quando temos um método em uma classe base e o mesmo método em uma classe derivada, sem as palavras virtual e override, o método da classe DERIVADA é ignorado e o método executado é o da classe BASE. Então utilizamos override/virtual quando quisermos sobrescrever o método da classe BASE e executar o método da classe DERIVADA.

A explicação da atividade em questão "Repetição de membros" explicou como se fosse o contrário, mas o teste do código no visual studio provou que meu entendimento estaria correto.

Alguém pode por favor me ajudara esclarecer?

Muito obrigado.

    public class Funcionario
    {

        public string Nome { get; set; }
        public string CPF { get; set; }
        public double Salario { get; set; }

        public virtual double GetBonificacao()
        {

            return Salario * 0.10;
        }

        public double CalcularTaxaAdministrativa()
        {
            return 1;
        }
    }

    `   public class Diretor : Funcionario
    {
        public override double GetBonificacao()
        {           
            return Salario + base.GetBonificacao();
        }

        public double CalcularTaxaAdministrativa()
        {
            return 0;
        }
    }`

    `   static void Main(string[] args)
        {
            GerenciadorBonificacao gerenciador = new GerenciadorBonificacao();

            Funcionario daniel = new Funcionario();

            daniel.Nome = "Daniel";
            daniel.CPF = "123.123.123.23";
            daniel.Salario = 10000;
            gerenciador.Registrar(daniel);

            Console.WriteLine(daniel.GetBonificacao());

            Funcionario nath = new Diretor();

            nath.Nome = "Nath";
            nath.CPF = "123.123.123.23";
            nath.Salario = 20000;
            gerenciador.Registrar(nath);

            Console.WriteLine(nath.GetBonificacao());

            Console.WriteLine(gerenciador.GetTotalBonificacao());

            Console.WriteLine("Diretor " + nath.CalcularTaxaAdministrativa()); // RETORNANDO 1
            Console.WriteLine("Funcionário " + daniel.CalcularTaxaAdministrativa()); // RETORNANDO 1
        }`
1 resposta
solução!

Olá, Daniel. Nesse seu entendimento: Pelo que entendi, quando temos um método em uma classe base e o mesmo método em uma classe derivada, sem as palavras virtual e override, o método da classe DERIVADA é ignorado e o método executado é o da classe BASE. Não é que o método seja ignorado. Ele existe individualmente em cada uma das classes, e de acordo com a referência quando você instancia ele, você uso o método respectivo.

Note que no exercício, é feita uma instância de ContaCorrente, que retorna 1, e não de Conta, que no caso retornaria 0.

class Program
{
    static void Main(string[] args)
    {
        ContaCorrente contaCorrente = new ContaCorrente();
        contaCorrente.Saldo = 1000;
        Console.WriteLine(contaCorrente.CalcularTaxaAdministrativa());
        Console.ReadLine();
    }
}

Como o método não foi sobrescrito, ele vai funcionar de acordo com a classe instanciada.

Lembre-se que na aula, o instrutor até mostra um exemplo usando as duas classes Funcionario e Diretor, e antes do override, cada uma apresneta um resultado diferente, justamente por ser instâncias de classes diferentes.

Espero ter ajudado.