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
Produtodeve ter os camposNome,Precoe o campo estáticoTotalProdutos. - O construtor deve usar
this.Nomeethis.Precopara atribuir os parâmetros. - O construtor deve incrementar
TotalProdutos. - O método
AplicarDescontodeve reduzir o preço pelo percentual informado. - O
Maindeve 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
- Declaramos os campos
NomeePrecocomo públicos eTotalProdutoscomo estático. - O construtor recebe
nomeeprecoe usathis.Nome = nomeethis.Preco = precopara deixar claro que o campo pertence ao objeto atual. - Dentro do construtor, incrementamos
TotalProdutospara contar cada objeto criado. - O método
AplicarDescontocalcula o fator multiplicativo:1 - (percentual / 100). Por exemplo, 10% vira 0.90. - Multiplicamos
this.Precopelo fator, atualizando o preço do objeto. - No
Main, criamosp1ep2com preços iniciais e aplicamos os descontos solicitados. - Imprimimos os dados formatados com
:F2para duas casas decimais e o total de produtos usandoProduto.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
thisno construtor:Nome = nome;atribui o parâmetro a ele mesmo, deixando o campo sem valor (ou com valor padrão). - Usar
floatoudoublepara dinheiro: pode gerar erros de arredondamento. Prefiradecimal. - 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
:F2para garantir o formato. - Tentar acessar
TotalProdutoscomop1.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