1
resposta

[Projeto] Minha resolução

Minha Resolução do desafio

namespace SistemaClube;

public class Pessoa 
{ 
    public string Nome { get; set; } 
    public int Idade { get; set; } 
    
    public Pessoa (string nome, int idade) 
    { 
        Nome = nome; 
        Idade = idade; 
    } 
} 
namespace SistemaClube; 

public class ClienteVip : Pessoa 
{ 
    public string NivelFidelidade { get; set; } 
    public string CodigoVip { get; set; } 
    
    public ClienteVip(string nome, int idade, string nivelFidelidade, string codigovip) : base(nome, idade) 
    { 
        NivelFidelidade = nivelFidelidade; 
        CodigoVip = codigovip; 
    } 
} 
using SistemaClube; 

ClienteVip cliente1 = new ClienteVip("Renata", 32, "Ouro", "VIP123A"); 
ClienteVip cliente2 = new ClienteVip("Leonardo", 40, "Diamante", "VIP789X"); 

Console.WriteLine(\$"Bem-vindo, cliente VIP: {cliente1.Nome}"); 
Console.WriteLine(\$"Idade: {cliente1.Idade}"); 
Console.WriteLine(\$"Nível fidelidade: {cliente1.NivelFidelidade}"); 
Console.WriteLine(\$"Código: {cliente1.CodigoVip}\n"); 

Console.WriteLine(\$"Bem-vindo, cliente VIP: {cliente2.Nome}"); 
Console.WriteLine(\$"Idade: {cliente2.Idade}"); 
Console.WriteLine(\$"Nível de Fidelidade: {cliente2.NivelFidelidade}"); 
Console.WriteLine(\$"Código VIP: {cliente2.CodigoVip}\n"); 
1 resposta

Olá, Guilherme. Como vai?

Excelente resolução! Você aplicou de forma muito precisa um dos pilares fundamentais da Orientação a Objetos: a Herança.

O uso da palavra-chave : Pessoa na classe ClienteVip estabelece a relação de "é um", ou seja, um ClienteVip é uma Pessoa. Isso permite que você reaproveite os atributos Nome e Idade sem precisar reescrevê-los, mantendo seu código limpo e organizado (princípio DRY - Don't Repeat Yourself).

Destaques Técnicos do seu Código

  • Uso do Construtor com base: Esse é o ponto alto do seu código. Ao usar : base(nome, idade), você garante que a classe pai (Pessoa) seja inicializada corretamente antes que as propriedades específicas da classe filha sejam preenchidas.
  • Encapsulamento com Auto-Implemented Properties: O uso de { get; set; } é a forma padrão e recomendada no C# moderno para expor dados de forma controlada.
  • Namespaces: Organizar seu código em namespace SistemaClube é uma ótima prática de arquitetura, evitando conflitos de nomes em projetos maiores.

Sugestão de Refatoração (C# Moderno)

Desde o C# 12, temos um recurso chamado Primary Constructors que pode deixar sua classe Pessoa ainda mais enxuta. Veja como ficaria:

namespace SistemaClube;

// Pessoa usando Primary Constructor
public class Pessoa(string nome, int idade)
{ 
    public string Nome { get; set; } = nome; 
    public int Idade { get; set; } = idade; 
} 

public class ClienteVip(string nome, int idade, string nivelFidelidade, string codigoVip) 
    : Pessoa(nome, idade) 
{ 
    public string NivelFidelidade { get; set; } = nivelFidelidade; 
    public string CodigoVip { get; set; } = codigoVip; 
}

Para Evoluir o Projeto

Como o curso também aborda Herança vs. Composição, um bom desafio para você seria: e se um cliente deixasse de ser VIP? Na herança, você não consegue "mudar" o tipo do objeto em tempo de execução. Nesses casos, a composição (onde uma Pessoa tem um PerfilVip) costuma ser mais flexível.

Seu código está muito bem estruturado e fácil de ler. Parabéns pelo empenho!

Você já chegou a pensar em algum método que seria comum a todas as pessoas do clube (como um FazerLogin) e como ele se comportaria na classe VIP?