Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Projeto] Sistema de pagamentos

package pagamentos.de.sistema;

public abstract class Pagamento {
    protected double valor;

    public Pagamento(double valor) {
        this.valor = valor;
    }

    public abstract void confirmarPagamento();
}

package pagamentos.de.sistema;

public class CartaoCredito extends Pagamento implements CalcularTaxa{
    public CartaoCredito(double valor) {
        super(valor);
    }

    @Override
    public double calcularTaxa() {
        return valor * 0.03;
    }

    @Override
    public void confirmarPagamento() {
        System.out.printf("Pagamento de R$%.2f confirmado no Cartão de Crédito (Taxa: R$%.2f)\n",valor, calcularTaxa());

    }
}

package pagamentos.de.sistema;

public class Boleto extends Pagamento implements CalcularTaxa{
    public Boleto(double valor) {
        super(valor);
    }

    @Override
    public double calcularTaxa() {
        return valor * 0.01;
    }

    @Override
    public void confirmarPagamento() {
        System.out.printf("Boleto de R$%.2f gerado com sucesso (Taxa: R$%.2f)\n",valor, calcularTaxa());

    }
}

package pagamentos.de.sistema;

public class Pix extends Pagamento{
    public Pix(double valor) {
        super(valor);
    }

    @Override
    public void confirmarPagamento() {
        System.out.printf("Pagamento via Pix de R$%.2f confirmado\n", valor);
    }
}

package pagamentos.de.sistema;

public interface CalcularTaxa {

    public double calcularTaxa();
}

package pagamentos.de.sistema;

public class SistemaDePagamento {
    public static void main(String[] args) {

        Pagamento cartao = new CartaoCredito(250.00);
        Pagamento boleto = new Boleto(500.00);
        Pagamento pix = new Pix(300.00);

        cartao.confirmarPagamento();
        boleto.confirmarPagamento();
        pix.confirmarPagamento();
    }
}
3 respostas

Oi, Augusto. Como vai?

Obrigada por compartilhar seu código com a comunidade Alura.

Gostei bastante da forma como você estruturou a classe Pagamento como abstrata e utilizou interface para o cálculo de taxa em CartaoCredito e Boleto.

Essa decisão mostra um bom entendimento de herança e polimorfismo, permitindo que todos os tipos sejam tratados como Pagamento no main. Isso deixa o código mais organizado, desacoplado e preparado para receber novos meios de pagamento no futuro, sem grandes alterações na estrutura principal.

Uma sugestão de melhoria é sobrescrever o método toString() nas classes, para facilitar a exibição das informações do objeto e evitar repetição de código ao imprimir dados. Por exemplo:


@Override
public String toString() {
    return "Valor: R$" + valor;
}

Dessa forma, você pode utilizar diretamente:

System.out.println(objeto);

Isso torna o código mais limpo, reutilizável e alinhado às boas práticas de orientação a objetos.

Continue praticando. Sua base em conceitos de POO está bem construída e isso fará diferença nos próximos desafios.

Alura

Conte com o apoio da comunidade Alura na sua jornada. Bons estudos.

Oi, eu não entendi muito bem, poderia explicar de novo por favor?

solução!

Oi, Augusto!

Vou tentar explicar melhor: toString() serve para definir como o objeto será exibido quando você usar System.out.println(objeto).

Se você não sobrescrever, o Java mostra algo como:
pagamentos.de.sistema.CartaoCredito@6d06d69c
Ou seja, não mostra o valor nem a taxa.

O que você deve fazer

1️⃣ Criar o método toString() nas classes.
2️⃣ Usar System.out.println(objeto); no main.

Ajuste seu código assim:

CartaoCredito

@Override
public String toString() {
    return String.format(
        "Pagamento de R$%.2f confirmado no Cartão de Crédito (Taxa: R$%.2f)",
        valor, calcularTaxa()
    );
}

Boleto

@Override
public String toString() {
    return String.format(
        "Boleto de R$%.2f gerado com sucesso (Taxa: R$%.2f)",
        valor, calcularTaxa()
    );
}

Pix

@Override
public String toString() {
    return String.format(
        "Pagamento via Pix de R$%.2f confirmado",
        valor
    );
}

No main você pode fazer assim:

System.out.println(cartao);
System.out.println(boleto);
System.out.println(pix);

Resumindo

  • toString() define como o objeto aparece em texto.
  • println(objeto) chama automaticamente esse método.
  • Deixa o código mais organizado e evita repetir printf.

Fico à disposição. Abraços e bons estudos!