1
resposta

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

interface IServico
{
    void ExecutarServico();
}

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

    public string Nome { get; private set; }
    public string Departamento { get; private set; }

    public override string ToString()
    {
        return $"{Nome} - Departamento: {Departamento}";
    }
}

abstract class Servico : IServico
{
    protected Servico(string tipo, string titulo, Funcionario funcionario)
    {
        Titulo = titulo;
        Funcionario = funcionario;
        Tipo = tipo;
    }

    public string Titulo { get; private set; }
    public string Tipo { get; private set; }
    public Funcionario Funcionario { get; private set; }

    public void ExecutarServico()
    {
        Console.WriteLine($"Executando serviço de {Tipo}: {Titulo}");
        Console.WriteLine($"Responsável: {Funcionario.ToString()}\n");
    }
}

class Manutencao : Servico
{
    public Manutencao(string titulo, Funcionario funcionario) : base(nameof(Manutencao), titulo, funcionario)
    {
    }
}

class Consultoria : Servico
{
    public Consultoria(string titulo, Funcionario funcionario) : base(nameof(Consultoria), titulo, funcionario)
    {
    }
}

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

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

s1.ExecutarServico();
s2.ExecutarServico();
1 resposta

Olá, Eduardo! Tudo bem?

Que projeto fantástico para consolidar o aprendizado! Você conseguiu unir, em um único exemplo, Herança, Composição, Interfaces e Classes Abstratas. Esta é a estrutura clássica de um sistema robusto de gestão.

Seu código reflete um entendimento profundo de como os objetos devem se relacionar em C#:

Destaques Técnicos do seu Projeto:

  • Composição Estratégica: A classe Servico não herda de Funcionario; ela possui um Funcionario. Isso é o uso correto da composição para representar a responsabilidade: um serviço "tem um" responsável.
  • Contrato via Interface: Ao implementar IServico, você garante que qualquer novo tipo de serviço que venha a existir terá obrigatoriamente o método ExecutarServico(). Isso permite que você trate Manutencao e Consultoria de forma genérica, como fez ao declarar as variáveis como IServico s1.
  • Abstração e Reuso: O uso de uma abstract class Servico é perfeito aqui. Você impede que um "Serviço" genérico seja criado sem um tipo definido, mas centraliza toda a lógica de exibição e armazenamento de dados, evitando repetição de código nas classes filhas.
  • **Uso Inteligente de nameof**: Passar o tipo do serviço usando base(nameof(Manutencao), ...) é uma prática excelente para evitar erros de digitação e manter o código limpo.
  • **Sobrescrita de ToString()**: Personalizar o ToString() na classe Funcionario facilita muito a exibição de logs e mensagens, tornando a saída do console muito mais legível.

Por que esta estrutura é profissional?

Se amanhã você precisar criar um serviço de "Limpeza", basta criar uma nova classe que herde de Servico. Se precisar trocar o funcionário responsável, a composição permite isso facilmente.

Com este projeto, você demonstrou que domina a transição entre o pensamento de "Herança" (é um) e "Composição" (tem um).

Parabéns pela dedicação constante e pela qualidade técnica em cada um dos seus 91 posts!

Espero que possa ter lhe ajudado!