Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Resolução] Faça como eu fiz: gestão de serviços

Funcionario.cs

namespace E09GestaoDeServicos.Models;

internal class Funcionario(string nome, string departamento)
{
    public string Nome { get; } = nome;
    public string Departamento { get; } = departamento;
}

IServico.cs

namespace E09GestaoDeServicos.Interfaces;

internal interface IServico
{
    void ExecutarServico();
}

Servico.cs

namespace E09GestaoDeServicos.Models;

internal abstract class Servico(string tituloDaTarefa, Funcionario responsavel)
{
    public string TituloDaTarefa { get; } = tituloDaTarefa;
    public Funcionario Responsavel { get; } = responsavel;
}

Manutencao.cs

using System.Text;
using E09GestaoDeServicos.Interfaces;

namespace E09GestaoDeServicos.Models;

internal class Manutencao(string tituloDaTarefa, Funcionario responsavel)
    : Servico(tituloDaTarefa, responsavel), IServico
{
    public void ExecutarServico()
    {
        StringBuilder sb = new();
        sb.AppendLine($"\nExecutando serviço de manutenção: {TituloDaTarefa}");
        sb.AppendLine($"Responsável: {Responsavel.Nome} - Departamento: {Responsavel.Departamento}");
        Console.WriteLine(sb.ToString());
    }
}

Consultoria.cs

using System.Text;
using E09GestaoDeServicos.Interfaces;

namespace E09GestaoDeServicos.Models;

internal class Consultoria(string tituloDoServico, Funcionario responsavel)
    : Servico(tituloDoServico, responsavel), IServico
{
    public void ExecutarServico()
    {
        StringBuilder sb = new();
        sb.AppendLine($"Executando serviço de consultoria: {TituloDaTarefa}");
        sb.AppendLine($"Responsável: {Responsavel.Nome} - Departamento: {Responsavel.Departamento}");
        Console.WriteLine(sb.ToString());
    }
}

Program.cs

using E09GestaoDeServicos.Interfaces;
using E09GestaoDeServicos.Models;

Funcionario tecnico = new("João", "TI");
IServico s1 = new Manutencao("Atualização de servidor", tecnico);

Funcionario analista = new("Marina", "Consultoria");
IServico s2 = new Consultoria("Planejamento estratégico", analista);

s1.ExecutarServico();
s2.ExecutarServico();

-----------Dúvida------------
Sei que o exercício pede o uso de interface aqui, mas como eu criei uma classe base Serviço, onde todos os serviços vão herdar suas propriedades e métodos.. eu poderia ter o método abstrato ExecutarServico() dentro da classe Serviço e sobrescreve-lo nas classes filhas, certo? Ou para esse cenário devemos sempre utilizar interfaces?

2 respostas

Olá, Gerson, como vai?

Sua implementação está consistente com a proposta da atividade. A interface foi aplicada corretamente para padronizar a execução dos serviços, e o uso de composição com a classe Funcionario ficou bem representado. A criação da classe base Servico para concentrar os dados comuns também foi uma boa decisão de organização, mesmo não sendo obrigatória no enunciado.

Sobre a sua dúvida, sim, seria totalmente possível declarar o método ExecutarServico() como abstrato dentro da classe Servico e sobrescrevê-lo nas classes filhas. Esse é um caminho válido quando todos os tipos compartilham obrigatoriamente a mesma hierarquia de herança. Nesse caso, a classe base já definiria o “contrato” de implementação.

A escolha entre interface e classe abstrata depende do objetivo do design. Interfaces são mais flexíveis quando você precisa garantir um contrato comum entre classes que não necessariamente compartilham a mesma herança. Já a classe abstrata funciona melhor quando há reaproveitamento direto de estado e comportamento base, como você estruturou com Servico.

Obrigado por compartilhar sua resolução e reflexão sobre o exercício. Esse tipo de questionamento mostra maturidade no entendimento de orientação a objetos. O fórum segue à disposição.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!
solução!

Massa, muito obrigado pela explicação.. vlw mesmo Mike.