1
resposta

O Estagiario não consegue chamar o GetBonificação na classe Main

Se eu entendi bem era pra classe base que tivesse o internal protected passar para classe derivada - fora do projeto - o referido método, bastando que a classe derivada colocasse na assinatura do método o modificador protected, não é isso?

Acontece que a classe Estagiario herda Funcionário e usa o protected no método GetBofificacao(), mas mesmo com o modificador protected nesse método, na classe Main, o Estagiario não é capaz de chamar GetBofificacao()

Ou seja, não funciona. Alguém pode esclarecer essa dúvida?

1 resposta

Olá Ley, tudo bem?

Se o código é protected é porque ele realmente não deve ser usado em um contexto fora da própria classe e as classes filhas. Classes externas só poderão utilizar esses códigos apenas por meios indiretos. Que é o que ocorre com o método GetBonificacao() neste exemplo:

public Estagiario(double salario, string cpf)
    :base(salario, cpf)
{
    GetBonificacao();
}

public override void AumentarSalario()
{
    // Qualquer código
}

protected override double GetBonificacao()
{
    return Salario = Salario + Salario * .1;
}

Estes códigos dentro da classe Estagiario funcionam bem. E ao criar o objeto do tipo Estagiario em Program.cs, o GetBonificacao() também é executado, porque esse método foi chamado dentro da classe que ele pode ser usado. Mas não é possível utilizar o GetBonificacao() fora da classe Estagiário, porém, podemos executar esse código com uma gambiarra (que não é aconselhavel, porque se o método é protegido, deve ter um bom motivo para isso) dentro da classe Estagiário:

public double Bonificar()
{
    return GetBonificacao();
}

Com este código acima, é possível bonificar o Estagiario, mesmo que esse método seja protegido, mas como disse, não é recomendado fazer isso.

Sugiro que faça testes com métodos protegido para ver até onde vai a limitação deles e o que pode fazer em relação às restrições deles.

Espero ter ajudado!