1
resposta

Dúvida na classe base

namespace ByteBank.Funcionarios
{
    public abstract class Funcionario
    {

        public static int TotalDeFuncionarios { get; private set; }

        public string Nome { get; set; }
        public string CPF { get; private set; }
        public double Salario { get; protected set; }
        // com protected o acesso pode ser feito pela classe base ou derivada e se mantem privado para acessos fora dessas classes.


        public Funcionario(double salario, string cpf)
        {
            Console.WriteLine("Criando");

            CPF = cpf;
            Salario = salario;

            TotalDeFuncionarios++;
        }

        public virtual void AumentarSalario()
        {
            //Salario = Salario * 1.1;
            Salario *= 1.1;


        }

        public virtual double GetBonificacao()
        {

            return Salario * 0.10;
        }


    }
}

Quando rodo o código, como as outras classes tem a classe Funcionário como base, a mensagem "Criando" aparece para todas . Como faço para que cada classe apareça seu nome específico, sem precisar escrever Console.Writeline("Função x") em cada uma?

1 resposta

Olá Luiz, tudo certo?

A maneira mais fácil seria realmente colocar no construtor da classe filha para executar essa função.

Mas para fazer de outro jeito, você precisaria te mais um construtor na classe Funcionario, e neste construtor receber mais uma string por parâmetro. Essa string deve ser ou a mensagem que quer escrever ou então uma parte dessa string que será escrita.

A classe Funcionario ficaria mais ou menos assim:

// Outros códigos da classe
public Funcionario(double salario, string cpf)
{
    CPF = cpf;
    Salario = salario;

    TotalDeFuncionarios++;
}

public Funcionario(double salario, string cpf, string mensagem) : this (salario, cpf)
{
    Console.WriteLine($"Criando {mensagem}");
}

// Outros códigos da classe

E a classe Diretor, por exemplo ficaria assim:

public class Diretor : Funcionario
{
    const string CARGO = "DIRETOR";
    public Diretor(double salario, string cpf, string cargo = CARGO) : base(salario, cpf, CARGO)
    {
    }
}

Com isso, é só instânciar um objeto que aparece a mensagem: Diretor d = new Diretor(5000, "321684985");

O resultado é o mesmo que se tivesse colocado o Console.WriteLine() no construtor da classe filha.

Aí veja qual é a melhor forma para o seu código, e se esse código que passei faz sentido.

Bons estudos!