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 Funcionario deve ser abstract e conter CalcularSalario como abstract.
  • As classes Gerente e Desenvolvedor devem herdar de Funcionario e implementar CalcularSalario.
  • 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

  1. A classe Funcionario é abstract e define CalcularSalario como abstract, sem corpo. Isso força as classes derivadas a fornecerem uma implementação.
  2. Gerente herda de Funcionario e sobrescreve CalcularSalario aplicando 20% de bônus.
  3. Desenvolvedor faz o mesmo, mas com 10% de bônus.
  4. No Main, criamos uma lista de Funcionario com instâncias das classes concretas.
  5. Percorremos a lista e exibimos o tipo real (GetType().Name), o nome e o salário calculado.
  6. A formatação :F2 garante 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 Funcionario diretamente: new Funcionario() gera erro de compilação porque é abstrata.
  • Esquecer de implementar CalcularSalario em uma classe derivada: erro de compilação.
  • Usar virtual em vez de abstract na 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