Esse referencia Desconto cadeiaDeDescontos em tempo de execucao tera uma referencia ao objeto DescontoParaOrcamentoComMaisDeCincoItens , e este com DescontoParaOrcamentoComValorMaiorQueQuinhentos, que tera com SemDesconto
Como esses objetos sao extensoes de Desconto, durante a execucao eles terao de forma concreta os tres metodos:
- calcular (igual aos 3, por que e definido na classe mae)
Contudo estes sao distintos, por que possuem sua propria implementacao em cada classe que extende a mae, onde que a mae declara-os como abstratos.
- efetuar calculo
- deveAplicar
Entao o reuso e possivel porque existe essa relacao de heranca entre a classe mae e a classe filha, onde a mae usa dos metodos implementados pelo filha, por meio do mecanismo abstract, que garante essa implementacao, e em tempo de execucao internamente acessa o tipo do objeto, que encontra as implementacoes necessarias.
Teremos tres objetos ? que por heranca carregam a classe Desconto em tempo de execucao pela jvm
- DescontoParaOrcamentoComMaisDeCincoItens
- DescontoParaOrcamentoComValorMaiorQueQuinhentos
- SemDesconto
package br.com.alura.loja.desconto;
import java.math.BigDecimal;
import br.com.alura.loja.orcamento.Orcamento;
public class CalculadoraDeDescontos {
public BigDecimal calcular(Orcamento orcamento) {
Desconto cadeiaDeDescontos = new DescontoParaOrcamentoComMaisDeCincoItens(
new DescontoParaOrcamentoComValorMaiorQueQuinhentos(
new SemDesconto()
)
);
return cadeiaDeDescontos.calcular(orcamento);
}
}