3
respostas

Dúvida na atividade 5

public interface Calculavel {
    double calcularPrecoFinal();
}

public class Livro extends Produto implements Calculavel {
    private String autor;

    public double calcularPrecoFinal() {
        return preco * 0.9; 
    }
}

public class ProdutoFisico extends Produto implements Calculavel {
    public double calcularPrecoFinal() {
        // Implementação com taxas adicionais para produtos físicos
        return preco * 1.05; 
    }

Vi que precisa criar a classe Produto. Poderia me ajudar na classe main para testar? Tentei fazer, mas aplicando com o polimorfismo sem repetição de código, como seria?

3 respostas

Eu consegui assim:

Classe Produto

package br.com.alura.screenmatch.desafios.precofinal;

public class Produto {
    private double preco;

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }
}

Classe ProdutoFisico que estende Produto e implementa Calculavel

package br.com.alura.screenmatch.desafios.precofinal;

public class ProdutoFisico extends Produto implements Calculavel {

    @Override
    public double calcularPrecoFinal() {
        double taxa = 0.2;
        double precoFinal = getPreco() + getPreco() * taxa;
        return precoFinal;
    }
}

Classe Livro que estende Produto e implementa Calculavel

package br.com.alura.screenmatch.desafios.precofinal;

public class Livro extends Produto implements Calculavel {
    private String autor;

    @Override
    public double calcularPrecoFinal() {
        double desconto = 0.1;
        double precoFinal = getPreco() - getPreco() * desconto;
        return precoFinal;
    }
}

Classe main TestePrecoFinal que usa um método estático para exibir o preço calculado

package br.com.alura.screenmatch.desafios.precofinal;

public class TestePrecoFinal {
    public static void main(String[] args) {
        Livro livro = new Livro();
        livro.setPreco(100);
        exibePrecoFinal(livro);

        ProdutoFisico produtoFisico = new ProdutoFisico();
        produtoFisico.setPreco(100);
        exibePrecoFinal(produtoFisico);
    }

    public static void exibePrecoFinal(Calculavel prod) {
        System.out.println("Aqui está passando o produto do tipo: " + prod);
        System.out.println("O preço final do produto é: " + prod.calcularPrecoFinal());
    }

}

Se tiver como melhorar o código, com o que foi visto até agora, por favor comentem... O método estático ainda não foi visto, mas eu peguei no Google, porque achei que criar outra classe só para exibir o resultado seria muita coisa, o que acham?

Olá, Sergio! Parabéns pela sua resolução! Ficou muito boa.

Dava pra simplificar o código utilizando o recurso de Listas para percorrer sobre cada item da lista e calcular o preço, ficando algo assim:

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

        List<Calculavel> produtos = new ArrayList<>();
        produtos.add(new Livro(100));
        produtos.add(new ProdutoFisico(100));

        for (Calculavel produto: produtos){
            System.out.println(produto.calcularPrecoFinal());
        }
    }
}

Sei que neste curso ainda não foi visto sobre lista, mas depois que estudar tente aplicar algo parecido.

Bons estudos :)

Obrigado Vinicius!