Desafio C#

Classe Produto com this e estáticos

Enunciado

Crie uma classe Produto com campos de instância Nome (string) e Preco (decimal), e um campo estático TotalProdutos (int). O construtor deve receber nome e preco e usar this para diferenciar os parâmetros dos campos. Incremente TotalProdutos no construtor. Adicione um método AplicarDesconto(decimal percentual) que reduz o preço em percentual por cento. No Main, crie dois produtos, aplique 10% de desconto no primeiro e 5% no segundo, e exiba o nome, o preço final e o total de produtos criados.

Requisitos

  • A classe Produto deve ter os campos Nome, Preco e o campo estático TotalProdutos.
  • O construtor deve usar this.Nome e this.Preco para atribuir os parâmetros.
  • O construtor deve incrementar TotalProdutos.
  • O método AplicarDesconto deve reduzir o preço pelo percentual informado.
  • O Main deve criar dois produtos, aplicar os descontos e imprimir os dados e o total.

Código inicial

using System;

public class Produto
{
    // Declare os campos

    // Declare o construtor usando this

    // Declare o método AplicarDesconto
}

public class Program
{
    public static void Main()
    {
        // Crie dois produtos, aplique descontos e exiba os resultados
    }
}

Saída esperada

Produto: Caneta, Preço final: 9,00
Produto: Caderno, Preço final: 19,00
Total de produtos: 2
Ver dica

Para formatar o preço com duas casas decimais e vírgula, use Preco.ToString("F2") ou interpolação com formato {Preco:F2}. Lembre-se de que decimal é mais adequado para dinheiro.

Mostrar solução
using System;

public class Produto
{
    // Campos de instância.
    public string Nome;
    public decimal Preco;

    // Campo estático compartilhado.
    public static int TotalProdutos;

    // Construtor: usa this para diferenciar parâmetros dos campos.
    public Produto(string nome, decimal preco)
    {
        this.Nome = nome;
        this.Preco = preco;
        TotalProdutos++; // incrementa o total global
    }

    // Método que aplica desconto percentual.
    public void AplicarDesconto(decimal percentual)
    {
        // Calcula o fator de desconto, por exemplo, 10% -> 0.90
        decimal fator = 1 - (percentual / 100);
        this.Preco *= fator;
    }
}

public class Program
{
    public static void Main()
    {
        // Cria dois produtos.
        Produto p1 = new Produto("Caneta", 10.00m);
        Produto p2 = new Produto("Caderno", 20.00m);

        // Aplica descontos.
        p1.AplicarDesconto(10); // 10% de desconto
        p2.AplicarDesconto(5);  // 5% de desconto

        // Exibe os resultados formatados.
        Console.WriteLine($"Produto: {p1.Nome}, Preço final: {p1.Preco:F2}");
        Console.WriteLine($"Produto: {p2.Nome}, Preço final: {p2.Preco:F2}");
        Console.WriteLine($"Total de produtos: {Produto.TotalProdutos}");
    }
}

Passo a passo

  1. Declaramos os campos Nome e Preco como públicos e TotalProdutos como estático.
  2. O construtor recebe nome e preco e usa this.Nome = nome e this.Preco = preco para deixar claro que o campo pertence ao objeto atual.
  3. Dentro do construtor, incrementamos TotalProdutos para contar cada objeto criado.
  4. O método AplicarDesconto calcula o fator multiplicativo: 1 - (percentual / 100). Por exemplo, 10% vira 0.90.
  5. Multiplicamos this.Preco pelo fator, atualizando o preço do objeto.
  6. No Main, criamos p1 e p2 com preços iniciais e aplicamos os descontos solicitados.
  7. Imprimimos os dados formatados com :F2 para duas casas decimais e o total de produtos usando Produto.TotalProdutos.

Por que funciona

O uso de this resolve a ambiguidade entre os nomes dos parâmetros e dos campos. O campo estático TotalProdutos é incrementado no construtor, então reflete o número total de objetos criados, independentemente de quantas instâncias existam. O método AplicarDesconto modifica apenas o preço do objeto em que foi chamado, pois acessa this.Preco.

Erros comuns

  • Esquecer o this no construtor: Nome = nome; atribui o parâmetro a ele mesmo, deixando o campo sem valor (ou com valor padrão).
  • Usar float ou double para dinheiro: pode gerar erros de arredondamento. Prefira decimal.
  • Não formatar o preço: a saída pode mostrar muitas casas decimais ou usar ponto em vez de vírgula dependendo da cultura. Use :F2 para garantir o formato.
  • Tentar acessar TotalProdutos como p1.TotalProdutos: embora permitido, o correto é Produto.TotalProdutos.

Outra forma de resolver

Usar propriedades autoimplementadas e um método que retorna o novo preço em vez de modificar o objeto:

public decimal CalcularPrecoComDesconto(decimal percentual) => Preco * (1 - percentual / 100);

Isso é preferível quando se quer manter o objeto imutável.

Saída esperada

Produto: Caneta, Preço final: 9,00
Produto: Caderno, Preço final: 19,00
Total de produtos: 2