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

Dúvida Exercício 2 Aula 4

No texto da explicação do design pattern Decorator, o atributo outroImposto da classe abstrata Imposto está como private final, mas não consigo herdá-lo para usar na classe filha, exemplo ICMS que herda de Imposto... na sobrescrita do método calculoDoOutroImposto é invocado o método calcula do atributo outroImposto. Só que por causa da sua visibilidade, não compila.

Minha dúvida é que se era para estar assim mesmo na explicação da aula 4 ?

Nesse caso para funcionar deixei o atributo como protected final.

package br.com.impostos;

import br.com.orcamento.Orcamento;

public abstract class Imposto {

    protected final Imposto outroImposto;

    public Imposto(Imposto outroImposto) {
        this.outroImposto = outroImposto;
    }

    public Imposto() {
        this.outroImposto = null;
    }

    public abstract double calcula(Orcamento orcamento);

    protected double calculoDoOutroImposto(Orcamento orcamento) {
        if (outroImposto == null) {
            return 0;
        } else {
            return outroImposto.calcula(orcamento);
        }
    }
}
package br.com.impostos;

import br.com.orcamento.Orcamento;

public class ICMS extends Imposto {

    public ICMS(Imposto outroImposto) {
        super(outroImposto);
    }

    @Override
    public double calcula(Orcamento orcamento) {
        return (orcamento.getValor() * 0.05) + 50;
    }

    @Override
    protected double calculoDoOutroImposto(Orcamento orcamento) {
        return outroImposto.calcula(orcamento);
    }

}
2 respostas
solução!

Fala aí Rafael, blz?

Cara você tem razão o atributo outroImposto tem que ser protected. Vou alterar a explicação agora.

Porém o método calculoDoOutroImposto não precisa ser sobrescrito nas classes filhas. Ele só é invocado dentro do método calcula nas classes filhas.

Espero ter ajudado!

Hmm, tem razão!!

Neste caso então está certo na explicação o atributo ser private.

Obrigado!