Considere o seguinte exemplo ilustrativo.
Emprestimo
Retomando o exercício anterior, considere a seguinte classe que representa um Emprestimo
, em que:
S
- valor da primeira parcelaN
- número de parcelasJ
– percentual de juros mensalCada nova parcela é sempre calculada em relação à anterior:
atual
= Panterior
mais Juros
In [1]:
public class Emprestimo {
float s;
int n;
float j;
int corrente;
float p;
Emprestimo(float s, int n, float j) {
this.s = s;
this.n = n;
this.j = j;
corrente = 1;
this.p = s;
}
float proximaParcela() {
float retorno = p;
corrente++;
if (corrente <= n)
p = p + (p * (j/100));
else
p = 0;
return retorno;
}
}
Out[1]:
In [5]:
public class EmprestimoTA extends Emprestimo {
private float ta;
EmprestimoTA(float s, int n, float j, float ta) {
super(s, n, j);
this.ta = ta;
}
public float getTa() {
return ta;
}
public float proximaParcela() {
float pp = super.proximaParcela();
if (pp > 0)
pp += ta;
return pp;
}
}
Out[5]:
In [6]:
Emprestimo empST = new Emprestimo(200, 5, 1);
EmprestimoTA empCT = new EmprestimoTA(200, 5, 1, 15);
int i = 1;
float pst = empST.proximaParcela();
float pct = empCT.proximaParcela();
while (pst > 0 || pct > 0) {
if (pst > 0)
System.out.println("Emprestimo sem taxa: parcela " + i + " eh " + pst);
if (pct > 0)
System.out.println("Emprestimo com taxa: parcela " + i + " eh " + pct);
pst = empST.proximaParcela();
pct = empCT.proximaParcela();
i++;
}
Out[6]:
Propriedade de se apresentar ou tomar formas diversas.
"Habilidade das mais importantes dos sistemas orientados a objetos, e que consiste em as operações automaticamente se adequarem aos objetos aos quais estão sendo aplicadas." (Meyer, 1997)
Meyer, Bertrand (1997) Object-Oriented Software Construction – Second Edition. USA, Prentice-Hall, Inc.
Uma variável declarada em uma classe A pode ser instanciada em qualquer subclasse B.
Nesse caso, só estarão “visíveis”(respeitadas as regras de encapsulamento):
O contrário não é possível: Uma variável declarada em uma subclasse B não pode ser instanciada em sua superclasse A.
In [7]:
Emprestimo empST = new Emprestimo(200, 5, 1);
Emprestimo empCT = new EmprestimoTA(200, 5, 1, 15);
int i = 1;
float pst = empST.proximaParcela();
float pct = empCT.proximaParcela();
while (pst > 0 || pct > 0) {
if (pst > 0)
System.out.println("Emprestimo sem taxa: parcela " + i + " eh " + pst);
if (pct > 0)
System.out.println("Emprestimo com taxa: parcela " + i + " eh " + pct);
pst = empST.proximaParcela();
pct = empCT.proximaParcela();
i++;
}
Out[7]:
Como controlar um conjunto de empréstimos heterogêneos?
ConjuntoEmprestimos
A classe denominada ConjuntoEmprestimos
é responsável por controlar um conjunto de empréstimos. Essa classe deve definir pelo menos os seguintes métodos:
construtor
- recebe como parâmetro o número máximo de empréstimos;adicionaEmprestimo
- recebe como parâmetro um objeto da classe empréstimo e o armazena (se não ultrapassar o número máximo);proximasParcelas
- mostra as próximas parcelas de todos os empréstimos cadastrados (para fins de simplificação, considere que o número da próxima parcela é igual para todos); o método retorna um status de verdadeiro se houve pelo menos um empréstimo com próxima parcela.
In [3]:
public class ConjuntoEmprestimos {
Emprestimo vEmprestimos[];
int corrente = -1;
ConjuntoEmprestimos(int quantidade) {
vEmprestimos = new Emprestimo[quantidade];
}
boolean adicionaEmprestimo(Emprestimo emp) {
boolean resultado = false;
if (corrente+1 < vEmprestimos.length) {
corrente++;
vEmprestimos[corrente] = emp;
resultado = true;
}
return resultado;
}
boolean proximasParcelas() {
boolean status = false;
for (int e = 0; e < vEmprestimos.length; e++) {
float p = vEmprestimos[e].proximaParcela();
if (p > 0) {
status = true;
System.out.println("Emprestimo " + (e+1) + ": " + p);
}
}
return status;
}
}
Out[3]:
In [8]:
ConjuntoEmprestimos ce = new ConjuntoEmprestimos(5);
ce.adicionaEmprestimo(new Emprestimo(200, 3, 1));
ce.adicionaEmprestimo(new EmprestimoTA(500, 4, 2, 15));
ce.adicionaEmprestimo(new Emprestimo(300, 2, 1));
ce.adicionaEmprestimo(new Emprestimo(450, 3, 2));
ce.adicionaEmprestimo(new EmprestimoTA(700, 2, 3, 10));
boolean status;
do {
status = ce.proximasParcelas();
} while (status);
Out[8]: