Médio C#
Funcionários com bônus
Enunciado
Crie uma classe abstrata Funcionario com propriedades Nome e SalarioBase, e um método abstrato CalcularSalario(). Crie as classes Gerente e Desenvolvedor que herdam de Funcionario. O gerente recebe um bônus de 20% sobre o salário base; o desenvolvedor recebe um bônus de 10%. No Main, crie uma lista de Funcionario e exiba o nome e o salário final de cada um.
Requisitos
- A classe
Funcionariodeve serabstracte conterCalcularSalariocomoabstract. - As classes
GerenteeDesenvolvedordevem herdar deFuncionarioe implementarCalcularSalario. - O programa deve exibir os salários finais formatados com duas casas decimais.
Código inicial
using System;
using System.Collections.Generic;
abstract class Funcionario
{
public string Nome { get; set; }
public double SalarioBase { get; set; }
// TODO: declarar método abstrato CalcularSalario
}
class Gerente : Funcionario
{
// TODO: implementar CalcularSalario com bônus de 20%
}
class Desenvolvedor : Funcionario
{
// TODO: implementar CalcularSalario com bônus de 10%
}
class Program
{
static void Main()
{
// TODO: criar lista e exibir salários
}
}
Saída esperada
Gerente: Ana - Salário: 6000,00
Desenvolvedor: Bruno - Salário: 4400,00
Ver dica
Lembre-se de chamar base(nome) no construtor das classes derivadas ou usar inicializadores de propriedade.
Mostrar solução
using System;
using System.Collections.Generic;
abstract class Funcionario
{
public string Nome { get; set; }
public double SalarioBase { get; set; }
// Método abstrato: obriga as classes derivadas a implementarem
public abstract double CalcularSalario();
}
class Gerente : Funcionario
{
public override double CalcularSalario() => SalarioBase * 1.20;
}
class Desenvolvedor : Funcionario
{
public override double CalcularSalario() => SalarioBase * 1.10;
}
class Program
{
static void Main()
{
var funcionarios = new List<Funcionario>
{
new Gerente { Nome = "Ana", SalarioBase = 5000 },
new Desenvolvedor { Nome = "Bruno", SalarioBase = 4000 }
};
foreach (var f in funcionarios)
{
Console.WriteLine($"{f.GetType().Name}: {f.Nome} - Salário: {f.CalcularSalario():F2}");
}
}
}
Passo a passo
- A classe
Funcionarioéabstracte defineCalcularSalariocomoabstract, sem corpo. Isso força as classes derivadas a fornecerem uma implementação. Gerenteherda deFuncionarioe sobrescreveCalcularSalarioaplicando 20% de bônus.Desenvolvedorfaz o mesmo, mas com 10% de bônus.- No
Main, criamos uma lista deFuncionariocom instâncias das classes concretas. - Percorremos a lista e exibimos o tipo real (
GetType().Name), o nome e o salário calculado. - A formatação
:F2garante duas casas decimais.
Por que funciona
A classe abstrata define um contrato que todas as subclasses devem seguir. O polimorfismo permite que a lista de Funcionario armazene diferentes tipos e que a chamada a CalcularSalario seja resolvida dinamicamente. Assim, cada objeto usa sua própria regra de cálculo.
Erros comuns
- Tentar instanciar
Funcionariodiretamente:new Funcionario()gera erro de compilação porque é abstrata. - Esquecer de implementar
CalcularSalarioem uma classe derivada: erro de compilação. - Usar
virtualem vez deabstractna base: permitiria instanciar, mas aqui queremos forçar a implementação.
Outra forma de resolver
Poderia usar uma interface IFuncionario em vez de classe abstrata, mas a herança permite compartilhar propriedades comuns como Nome e SalarioBase.
Saída esperada
Gerente: Ana - Salário: 6000,00
Desenvolvedor: Bruno - Salário: 4400,00