1
resposta

[Projeto] Faça como eu fiz: catalogação de itens

Resolução:
ItemDigital.cs

namespace PraticandoC_05.CatalogoDeItens05
{
    internal class ItemDigital
    {
        public string? TituloItem { get; set; }
    }
}

Pergaminho.cs

namespace PraticandoC_05.CatalogoDeItens05
{
    internal class Pergaminho : ItemDigital
    {
        public Pergaminho(string? tituloItem, string? conteudoTextual)
        {
            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}");
        }
    }
}

Program.cs

var pergaminho = new Pergaminho("Segredos_Antigos.txt", "A chave para a sabedoria reside na observação...");
1 resposta

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!