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!