Olá, Christopher. Como vai?
Parabéns por concluir mais um desafio prático e por compartilhar sua solução com a comunidade do fórum! A ideia de modelar um sistema de catalogação de itens digitais com pergaminhos ficou bem interessante e lúdica.
Ao analisar o código da sua atividade, notei que a estrutura de herança (Pergaminho : ItemDigital) foi declarada de forma correta. No entanto, há um detalhe sutil na execução que fará com que o título do pergaminho saia em branco (vazio) no console quando o programa rodar.
Vamos analisar juntos o que está acontecendo na memória do computador e como ajustar o seu código para que ele funcione perfeitamente.
O problema do Título Invisível
No seu Program.cs, você instancia o pergaminho passando o título "Segredos_Antigos.txt". O construtor da classe Pergaminho recebe esse valor no parâmetro tituloItem.
O problema é que esse parâmetro nunca é guardado na propriedade TituloItem (que foi herdada da classe ItemDigital). Como a propriedade fica vazia, quando o método MostrarDetalhes() tenta ler TituloItem, ele imprime o texto em branco.
Como corrigir? (Duas abordagens possíveis)
Na Orientação a Objetos, temos duas formas elegantes de resolver essa situação:
Abordagem 1: Atribuição Direta no Construtor
Como a classe Pergaminho herda tudo de ItemDigital, ela tem acesso direto à propriedade TituloItem. Você pode simplesmente salvar o parâmetro dentro dela logo na primeira linha do construtor:
internal class Pergaminho : ItemDigital
{
public Pergaminho(string? tituloItem, string? conteudoTextual)
{
TituloItem = tituloItem; // Guardando o título herdado!
ConteudoTextual = conteudoTextual;
MostrarDetalhes();
}
public string? ConteudoTextual { get; }
// ... restante do código permanece igual
}
Abordagem 2: Utilizando Construtores na Classe Mãe (Boas Práticas)
Uma prática ainda mais recomendada em C# para cenários de herança é fazer com que a classe mãe seja a responsável por inicializar suas próprias propriedades através de um construtor. Veja como as duas classes conversam melhor dessa forma:
ItemDigital.cs
namespace PraticandoC_05.CatalogoDeItens05
{
internal class ItemDigital
{
public string? TituloItem { get; set; }
// Criamos um construtor na classe mãe
public ItemDigital(string? tituloItem)
{
TituloItem = tituloItem;
}
}
}
Pergaminho.cs
namespace PraticandoC_05.CatalogoDeItens05
{
internal class Pergaminho : ItemDigital
{
// Usamos o ": base(tituloItem)" para repassar o valor para a classe mãe
public Pergaminho(string? tituloItem, string? conteudoTextual) : base(tituloItem)
{
ConteudoTextual = conteudoTextual;
MostrarDetalhes();
}
public string? ConteudoTextual { get; }
public void MostrarDetalhes()
{
Console.WriteLine("Detalhes do pergaminho:");
Console.WriteLine($"Título: {TituloItem}");
Console.WriteLine($"Descrição: {ConteudoTextual}");
}
}
}
Por que a Abordagem 2 é vantajosa?
Se no futuro você criar outras classes que herdam de ItemDigital (como LivroDigital ou AudioLivro), você não precisará reescrever a lógica de atribuição do título em todos os construtores das classes filhas. Bastará usar o : base() e deixar que a classe mãe faça o trabalho dela, mantendo o seu código limpo e seguindo o princípio de reutilização.
Faça esse ajuste no seu ambiente e rode o Program.cs novamente para ver o título aparecendo lindamente no console!
Espero que possa ter lhe ajudado!