1
resposta

[Projeto] Faça como eu fiz: certificado de profissões

using System.Runtime.ConstrainedExecution;

namespace CertificadoProfissoes;

abstract class Profissao
{
    protected Profissao(string titulo)
    {
        Titulo = titulo;
    }

    public string Titulo { get; private set; }
}

class Analista : Profissao
{
    public Analista(string titulo) : base(titulo)
    {
    }
}

class Docente : Profissao
{
    public Docente(string titulo) : base(titulo)
    {
    }
}

class Certificado
{
    public Certificado(Profissao profissao)
    {
        Profissao = profissao;
    }

    public Profissao Profissao { get; set; }

    public void ExibirDetalhes()
    {
        Console.WriteLine($"Certificado emitido para: {Profissao.Titulo}");
    }
}

Analista analista = new Analista("Analista de Sistemas");
Docente docente = new Docente("Docente de Matemática");
Certificado cerf1 = new Certificado(analista); 
Certificado certf2 = new Certificado(docente);

cerf1.ExibirDetalhes();
certf2.ExibirDetalhes();
1 resposta

Olá, Eduardo! Tudo bem?

Excelente projeto! Você elevou o nível da discussão ao aplicar o conceito de Composição em conjunto com a Herança. No seu código, a classe Certificado não é uma profissão, ela tem uma profissão. Essa é uma distinção fundamental no design de software orientado a objetos.

Aqui estão os pontos de destaque da sua implementação:

  • Uso de Classes Abstratas: Ao definir Profissao como abstract, você impede que alguém instancie uma "profissão genérica", forçando a criação de tipos específicos como Analista ou Docente.
  • Composição (Has-A): A classe Certificado utiliza a composição ao receber um objeto do tipo Profissao em seu construtor. Isso torna o sistema flexível, pois o Certificado pode trabalhar com qualquer subclasse de Profissao sem precisar ser alterado.
  • **Modificador protected**: O uso de protected no construtor da classe base é uma ótima prática de segurança, garantindo que apenas as classes filhas possam acionar a inicialização da classe pai.
  • Polimorfismo: Note que o Certificado recebe o tipo base Profissao, mas na execução ele lida com instâncias de Analista ou Docente. Isso permite que você adicione dezenas de novas profissões no futuro sem mexer uma única linha na classe Certificado.

Um desafio para você

Como você já está dominando a relação entre essas classes, tente adicionar uma propriedade string NomePessoa à classe Certificado. Assim, o seu método ExibirDetalhes() poderia imprimir algo como: "Certificado de Analista de Sistemas emitido para: Eduardo". Isso deixaria o seu modelo ainda mais próximo de um sistema real de emissão de documentos!

Parabéns pela dedicação e pela clareza no código. Você está trilhando um caminho de muito sucesso no C#!

Espero que possa ter lhe ajudado!