Segue uma solução possível do desafio proposto:
Interface:
public interface Tributavel {
double getBaseCalculo();
}
Conta Corrente:
public class ContaCorrente extends Conta implements Tributavel{
public ContaCorrente (int agencia, int numero) {
super(agencia, numero);
}
@Override
public boolean sacar(double valor) {
double taxaDeSaque = 0.2;
double saqueTotal = taxaDeSaque + valor;
return super.sacar(saqueTotal);
}
@Override
public double getBaseCalculo() {
return super.getSaldo();
}
}
Investimentos:
public class Investimento extends Conta implements Tributavel {
public Investimento (int agencia, int numero) {
super(agencia, numero);
}
@Override
public double getBaseCalculo() {
return super.getSaldo();
}
}
Calculador Imposto:
public class CalculadorImposto {
private double aliquotaContaCorrente = 0.1;
private double aliquotaInvestimento = 0.15;
private double valorImpostoTotal;
public double calculaImposto (Tributavel tributavel) {
double imposto = 0;
if (tributavel instanceof ContaCorrente) {
imposto += tributavel.getBaseCalculo() * aliquotaContaCorrente;
valorImpostoTotal += imposto;
} else if (tributavel instanceof Investimento) {
imposto += tributavel.getBaseCalculo() * aliquotaInvestimento;
valorImpostoTotal += imposto;
} else {
return 0;
}
return imposto;
}
public double getImposto() {
return valorImpostoTotal;
}
}