Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
1
resposta

[Projeto] Faça como eu fiz: avaliação de conteúdos em uma plataforma

Classe Program:

List<Conteudo> conteudos = new()
{
    new AulaGravada("POO na prática", 45),
    new MaterialComplementar("Resumo do módulo 2", 12)
};

foreach (var conteudo in conteudos)
{
    conteudo.ExibirInfo();
}

Classe Conteudo:

namespace Polimorfismo.AvaliacaoConteudosPlataforma;

internal class Conteudo(string titulo)
{
    public string Titulo { get; set; } = titulo;

    public virtual void ExibirInfo()
    {
        Console.WriteLine($"Título: {Titulo}");
    }
}

Classe AulaGravada:

namespace Polimorfismo.AvaliacaoConteudosPlataforma;

internal class AulaGravada(string titulo, int duracao) : Conteudo(titulo)
{
    public int Duracao { get; set; } = duracao;

    public override void ExibirInfo()
    {
        Console.WriteLine($"Título: {Titulo}");
        Console.WriteLine($"Duração: {Duracao} min");
    }
}

Classe MaterialComplementar:

namespace Polimorfismo.AvaliacaoConteudosPlataforma;

internal class MaterialComplementar(string titulo, int numeroPaginas) : Conteudo(titulo)
{
    public int NumeroPaginas { get; set; } = numeroPaginas;

    public override void ExibirInfo()
    {
        Console.WriteLine($"Título: {Titulo}");
        Console.WriteLine($"Páginas: {NumeroPaginas}");
    }
}
1 resposta
solução!

Olá, Fabiano. Como vai?

Excelente implementação! O seu código ilustra perfeitamente o conceito de Polimorfismo de Subtipos, utilizando a herança de forma muito bem estruturada em C#.

Ao criar uma lista genérica do tipo pai (List<Conteudo>) e percorrê-la chamando o método ExibirInfo(), o C# consegue identificar em tempo de execução (Runtime) o tipo exato de cada objeto (AulaGravada ou MaterialComplementar) e executar o comportamento sobrescrito específico. Isso torna o seu código altamente extensível.

Para agregar ainda mais valor ao seu projeto, podemos analisar alguns pontos fortes da sua implementação e aplicar boas práticas modernas do C#.

Pontos Fortes do seu Código

  • Uso de Construtores Primários (Primary Constructors): Você utilizou a sintaxe moderna do C# (como em class Conteudo(string titulo)), o que reduz o código repetitivo (boilerplate) e deixa as classes extremamente limpas.
  • Uso correto de virtual e override: A herança de métodos foi aplicada de forma impecável, garantindo que o comportamento seja estendido corretamente nas classes filhas.

Sugestões de Boas Práticas e Evolução do Código

Se você quiser deixar essa estrutura ainda mais robusta e alinhada com o que encontramos no mercado, aqui estão duas melhorias interessantes:

1. Evitar Repetição de Código (Princípio DRY)

Repare que em todas as classes filhas você repetiu a linha Console.WriteLine($"Título: {Titulo}");. Como a classe base Conteudo já sabe imprimir o título, você pode reaproveitar o comportamento dela usando a palavra-chave base. Veja como fica mais elegante:

// Na classe AulaGravada
public override void ExibirInfo()
{
    base.ExibirInfo(); // Imprime o título automaticamente
    Console.WriteLine($"Duração: {Duracao} min");
}

// Na classe MaterialComplementar
public override void ExibirInfo()
{
    base.Base.ExibirInfo(); // Imprime o título automaticamente
    Console.WriteLine($"Páginas: {NumeroPaginas}");
}

2. Tornar a Classe Base Abstrata

No cenário de uma plataforma, faz sentido existirem aulas gravadas ou materiais complementares, mas faz sentido existir um conteúdo "puro" que não seja nenhum dos dois? Se a resposta for não, a boa prática é transformar a classe Conteudo em uma classe abstrata (abstract).

Isso impede que alguém faça um new Conteudo("Título genérico") por engano no meio do sistema, forçando a criação apenas dos subtipos específicos.

internal abstract class Conteudo(string titulo)
{
    public string Titulo { get; set; } = titulo;

    public virtual void ExibirInfo()
    {
        Console.WriteLine($"Título: {Titulo}");
    }
}

Parabéns pela dedicação e pelo domínio técnico demonstrado na atividade. O polimorfismo é um dos pilares mais importantes do paradigma orientado a objetos!

Espero que possa ter lhe ajudado!