Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Quando passar uma classe abstrata como parâmetro no construtor?

Como eu não sabia que era possível passar como parâmetro no construtor uma classe abstrata, acabei por criar dois construtores na classe Certificado.

Qual as diferenças entre uma abordagem e outra? E se as classes Docente e Analista tivessem mais propriedades e métodos, mesmo assim eu poderia passar como parâmetro no momento da instância do certificado e utilizar estas propriedades e métodos dentro da classe Certificado?

Segue abaixo o meu código:

Program.cs

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.ExibirCertificado();
certf2.ExibirCertificado();

Profissao.cs

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

Docente.cs

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

Analista.cs

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

Certificado.cs

class Certificado
{
    public Certificado(Analista analista)
    {
        Analista = analista;
    }
    public Certificado(Docente docente)
    {
        Docente = docente;
    }
    public Analista Analista { get; }
    public Docente Docente { get; }

    public void ExibirCertificado()
    {
        if(Analista != null)
        {
            System.Console.WriteLine($"Certificado emitido para: {Analista.Titulo}");
        }
        else if (Docente != null)
        {
            System.Console.WriteLine($"Certificado emitido para: {Docente.Titulo}");
        }
        else
        {
            System.Console.WriteLine("Nenhuma profissão informada para emitir o certificado.");
        }
    }
}

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta
solução!

Oi, Pedro! Como vai?

A diferença entre ter construtores separados e usar uma classe abstrata como parâmetro é que, com a abstração (Profissao), você ganha flexibilidade e baixo acoplamento.
Assim, o Certificado funciona para qualquer profissão, sem precisar criar novos construtores.

Por exemplo:


// Profissao.cs
abstract class Profissao
{
    protected Profissao(string titulo) => Titulo = titulo;
    public string Titulo { get; }
    public virtual string TextoCertificado() => $"Certificado emitido para: {Titulo}";
}

// Docente.cs
class Docente : Profissao
{
    public Docente(string titulo) : base(titulo) {}
    public override string TextoCertificado() => $"Certificado (Docência) para: {Titulo}";
}

// Analista.cs
class Analista : Profissao
{
    public Analista(string titulo) : base(titulo) {}
    public override string TextoCertificado() => $"Certificado (Análise) para: {Titulo}";
}

// Certificado.cs
class Certificado
{
    private readonly Profissao _profissao;
    public Certificado(Profissao profissao) => _profissao = profissao;
    public void ExibirCertificado() => System.Console.WriteLine(_profissao.TextoCertificado());
}

// Program.cs
var cert1 = new Certificado(new Analista("Analista de Sistemas"));
var cert2 = new Certificado(new Docente("Docente de Matemática"));
cert1.ExibirCertificado();
cert2.ExibirCertificado();

Assim, novas profissões podem ser adicionadas sem mudar o código do Certificado.
Se precisar de comportamentos específicos, use métodos virtuais, abstratos ou interfaces.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado