1
resposta

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

Resolução:
Profissao.cs

namespace PraticandoC_05.CertificadoDeProfissoes04
{
    internal abstract class Profissao
    {
        public string Titulo { get; set; }
        public Profissao(string titulo)
        {
            Titulo = titulo;
        }
    }
}

Docente.cs

namespace PraticandoC_05.CertificadoDeProfissoes04
{
    internal class Docente : Profissao
    {
        public Docente(string titulo) : base(titulo)
        {
        }
    }
}

Analista.cs

namespace PraticandoC_05.CertificadoDeProfissoes04
{
    internal class Analista : Profissao
    {
        public Analista(string titulo) : base(titulo) {}
    }
}

Certificado.cs

namespace PraticandoC_05.CertificadoDeProfissoes04
{
    internal class Certificado
    {
        public Certificado(Profissao profissao)
        {
            Console.WriteLine($"Certificado emitido para: {profissao.Titulo}");
        }
    }
}

Program.cs

using PraticandoC_05.CertificadoDeProfissoes04;

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

Olá, Christopher. Como vai?

Parabéns pela excelente resolução do exercício! O seu código demonstra de forma muito clara e prática como aplicar o conceito de Herança e, principalmente, o uso do Polimorfismo em C#.

A estrutura que você montou está impecável e segue as melhores práticas da Orientação a Objetos. Vamos destacar alguns pontos altíssimos da sua implementação para enriquecer o tópico para toda a comunidade do fórum:

1. Uso correto da palavra-chave abstract

Ao declarar a classe Profissao como abstract, você impede que ela seja instanciada diretamente (ex: new Profissao("Geral")). Isso faz todo o sentido no mundo real, afinal, "Profissão" é um conceito abstrato; o que existe na prática são as especializações dela, como Docente e Analista.

2. Passagem de parâmetros com o construtor base

Nas classes filhas (Docente e Analista), você utilizou corretamente o construtor herdado através do comando : base(titulo). Isso garante que a responsabilidade de inicializar a propriedade Titulo continue pertencendo à classe mãe, evitando duplicação de código.

3. O brilho do código: Polimorfismo no Certificado

O ponto alto do seu projeto está na classe Certificado. Ao projetar o construtor para receber a classe abstrata mãe Certificado(Profissao profissao), você tornou o seu código flexível e escalável.

A classe Certificado não precisa saber se está lidando com um docente, um analista ou um engenheiro; ela confia que qualquer objeto que herde de Profissao terá a propriedade Titulo disponível.

Se no futuro o sistema do curso precisar emitir certificados para uma nova profissão, como Designer, o impacto no seu código será zero:

// Exemplo de expansão futura sem modificar a classe Certificado
internal class Designer : Profissao
{
    public Designer(string titulo) : base(titulo) { }
}

// No Program.cs bastaria fazer:
Profissao designer = new Designer("Designer de Interface");
Certificado certf3 = new Certificado(designer);

Isso respeita o princípio do design de software que dita que o código deve ser aberto para extensão, mas fechado para modificação. Excelente contribuição e parabéns pela organização dos namespaces no projeto!

Espero que possa ter lhe ajudado!