Interface em java, duvida ao implementar

Duvida com implementação de interface - java

ola pessoal, é o seguinte

eu tenho um exercicio em que tenho uma classe abstracta chamada BankAccount, e em que tem duas subclasses que recebem sua herança, chamada conta à ordem e conta a prazo, até aqui tenho o programa a funcionar.

agora tenho na segunda alinea que fazer isto

"b) O departamento de Marketing do banco propôs criar uma nova conta, chamada Conta Poupança, que é uma conta a Prazo, mas quando o saldo é superior a 1000? e inferior a 2000? tem um juro de 2.5%. Implemente no seu sistema de gestão de contas esta nova possibilidade sem alterar as classes existentes na hierarquia de contas e teste juntando às contas existentes duas novas contas de Poupança."

Quer isto dizer que faço algo do género

[code]class extends ContaPrazo implements ContaPoupança [/code]

é isto? ou será que crio outra classe chamada conta poupança e ela recebe herança, extend, da classe a ContaPrazo?

a minha duvida é isto aqui " sem alterar as classes existentes na hierarquia de contas",

Eu acho que o mais correto aí seria extender a classe, ou seja, usar herança… vai ficar assim:

class ContaPoupanca extends ContaPrazo

Isso dá pra deduzir, pois esse trecho é bem claro:
“Conta Poupança, que é uma conta a Prazo

Esse “é” diz tudo…

obrigado pela sua resposta.

entao sugere que eu crio uma class chamada poupança como subclass da conta a prazo que por sua vez é filha da bankAccount?

é isso né?

ja agora pode dizer porque prefere extender a classe ao inves de criar uma interface?

cumps

Correto… os métodos que já existem nas classes pai serão reutilizados, e você apenas irá alterar os que precisam ser alterados, segundo os requisitos do exercício…

E é justamente por isso que eu prefiro a herança nesse caso, pois nas interfaces você não pode escrever código nenhum dentro dos métodos, obrigando que todas as classes que implementam a interface escrevam o código dos métodos…

muito obrigado pela sua ajuda, se me vir com dificuldades voltarei aqui ao post

:slight_smile:

[quote]Eu acho que o mais correto aí seria extender a classe, ou seja, usar herança… vai ficar assim:

view plaincopy to clipboardprint?

  1. class ContaPoupanca extends ContaPrazo

class ContaPoupanca extends ContaPrazo

Isso dá pra deduzir, pois esse trecho é bem claro:
“Conta Poupança, que é uma conta a Prazo”

Esse “é” diz tudo… [/quote]

Acho q isso q vc diz, não está correto, no caso, se uma classe implementa outra, ela é de outro tipo.

Exemplo: A extends B: A é um B
Exemplo: A implements B: A é um B tbm.

o que tem q ser feito ai, é ver o seguinte, se ContaPrazo é uma classe ou uma interface. Se for uma classe, vc tem q estender, se for uma interface, vc tem q implementar

no caso a ContaPrazo é uma classe

eu passo a explicar a lógica que tou seguindo a ver se tem algo errada com ela

-tenho uma classe abstracta chamada BankAccount
-tenho duas classes estendidas da BankAccount, conta à ordem e conta a prazo
-tenho a conta poupança a estender da conta a prazo

cada uma delas, das 3 classes, tem um construtor na sua propria classe, sendo que herdam todas da classe BankAccount as propriedades nome de conta e valor. Localmente na classe faço o calculo dos juros

tenho os valores de nome e valor numa arrayList

está correcto isto ? o programa pelo menos seguindo esta logica esta funcionando como pretendido, mas pode haver algum erro

cumps

[quote=billcaio][quote]Eu acho que o mais correto aí seria extender a classe, ou seja, usar herança… vai ficar assim:

view plaincopy to clipboardprint?

  1. class ContaPoupanca extends ContaPrazo

class ContaPoupanca extends ContaPrazo

Isso dá pra deduzir, pois esse trecho é bem claro:
“Conta Poupança, que é uma conta a Prazo”

Esse “é” diz tudo… [/quote]

Acho q isso q vc diz, não está correto, no caso, se uma classe implementa outra, ela é de outro tipo.

Exemplo: A extends B: A é um B
Exemplo: A implements B: A é um B tbm.

o que tem q ser feito ai, é ver o seguinte, se ContaPrazo é uma classe ou uma interface. Se for uma classe, vc tem q estender, se for uma interface, vc tem q implementar[/quote]

billcaio, leia a frase atentamente…

“Conta Poupança, que é uma conta a Prazo”

Posso dizer a mesma coisa sobre outras classes, vejamos…
ArrayList, que é uma List
SQLException, que é uma Exception

Imagine se voce estivesse programando esse sistema, mesmo sem esse requisito que o rapaz apresentou aí no tópico… se você já tivesse uma classe ContaPrazo, e quisesse criar uma outra classe que é quase igual á ela, mas com alguns itens diferentes, o que você faria?

Sim, podemos usar interface… mas imagine que você já tivesse uns 200 métodos prontos e precisasse mexer em apenas um… você usaria a interface e recriaria todos os métodos, ou herdaria a classe ContaPrazo pra reutilizar o que já existe e fazer apenas um override dos métodos que devem ser alterados?

[quote=billcaio][quote]Eu acho que o mais correto aí seria extender a classe, ou seja, usar herança… vai ficar assim:

view plaincopy to clipboardprint?

  1. class ContaPoupanca extends ContaPrazo

class ContaPoupanca extends ContaPrazo

Isso dá pra deduzir, pois esse trecho é bem claro:
“Conta Poupança, que é uma conta a Prazo”

Esse “é” diz tudo… [/quote]

Acho q isso q vc diz, não está correto, no caso, se uma classe implementa outra, ela é de outro tipo.

Exemplo: A extends B: A é um B
Exemplo: A implements B: A é um B tbm.

o que tem q ser feito ai, é ver o seguinte, se ContaPrazo é uma classe ou uma interface. Se for uma classe, vc tem q estender, se for uma interface, vc tem q implementar[/quote]

Poutz… tu leste o Post do cara ??? a resposta está certa, pelo menos para o que ele quer fazer… Aí nesse caso (estou desconsiderando regras de negócio de um banco) ele respondeu certinho o que o cara queria saber… e está certo pra ele ContaPoupança é uma Conta a Prazo… Logo é herança…

Abs []

[quote=felito]no caso a ContaPrazo é uma classe

eu passo a explicar a lógica que tou seguindo a ver se tem algo errada com ela

-tenho uma classe abstracta chamada BankAccount
-tenho duas classes estendidas da BankAccount, conta à ordem e conta a prazo
-tenho a conta poupança a estender da conta a prazo

cada uma delas, das 3 classes, tem um construtor na sua propria classe, sendo que herdam todas da classe BankAccount as propriedades nome de conta e valor. Localmente na classe faço o calculo dos juros

tenho os valores de nome e valor numa arrayList

está correcto isto ? o programa pelo menos seguindo esta logica esta funcionando como pretendido, mas pode haver algum erro

cumps[/quote]

Não vejo erros, não… esse é o conceito da herança, se existe uma classe que tenha tudo o que você precisa e você só precisa adicionar algumas coisinhas a mais, use herança…

Por exemplo, tenho a classe Veiculo e quero criar uma classe Carro … eu extendo a classe Veiculo…
Se eu tiver uma classe Automovel4Portas, eu extendo a classe Automovel? Não, extendo a classe Carro que já é um Carro também…

Poutz… percebeste que eu te defendi ??? Ou nem leste o que eu escrevi ??? :shock:

Eu já tava escrevendo quando você enviou a resposta… :roll:

só mais uma questão pessoal

agora relacionado com o private

private String accountName;
	private double balance;

[code]
@Override
public void deposit(double amount) {
// TODO Auto-generated method stub
balance = balance+amount;

}[/code]

o facto de as variaveis estar em private esta-me a dar problema nas subclasses por exemplo para fazer depositos ou levantamentos

prescindo do private? coloco protected?

ou alguma alternativa? eu em algumas partes ja tinha feito com setter e getters, mas neste caso penso que nao é a melhor solução

ficaria algo assim

		setBalance(getBalance()+amount);

thanks

é correto manter as variaveis de instância como private, para vc acessar elas, vc tem que acessar elas através dos metodos, declarados como public, isso é encapsulamento.

private String nome;

// atraves desse metodo vc altera a String
public void set Nome(String nome){
     this.nome = nome;
} 

// e nesse vc recupera
public String get Nome(){
    return nome;
}

kra, pega a apostila FJ-11 da caelum, vai te ajudar bastante.

kra, eu nao disse q oq vc falou está errado, eu discordei com oq vc disse de a letra “é”, dizer q tem estender a classe.

se vc tiver uma interface InterfaceA, e vc tiver uma classeB, que implemente a InterfaceA, essa classeB “é” uma InterfaceA. Correto??

então o “é” tanto serve para interface, quanto para extends. Basta saber se é uma classe ou uma interface. Se for uma classe, lógico q vc tem q estender ela, mas se for uma interface, vc implementa.

kra, o negocio não é se funcionou, eu sou estou falando, q a letra “é”, nem sempre diz q vc tem q estender a classe, pode ser uma interface e vc tenha q implementar, so quis explicar melhor, mas se o kra acha q ta bom, então blz, vo discutir pra q

mais uma questão e no fim de a resolver não incomodo mais :slight_smile:

eu tenho esta arraylist, só que agora eu necessito poder mudar os valores internos da conta

por exemplo tenho 5000 reais na primeira e o utilizador mediante nome correcto com o da conta poder fazer levantamento ou depositar mais dinheiro

(deveria ter uma password ou id, mas pro caso, apenas teórico, penso que chega o nome coincidir com o digitado pelo utlizador)

a minha duvida é:
? como fazer a pesquisa dentro deste array?
? alterar os valores depositados no array


List<AccountLongTerm> listLong = new ArrayList<AccountLongTerm>();
		listLong.add(new AccountLongTerm("António Pereira", 5000));
		listLong.add(new AccountLongTerm("Joaquim Francisco", 50));
		listLong.add(new AccountLongTerm("Carla Monteiro", 1500));

		for (int i = 0; i < listLong.size(); i++) {
			System.out.println(listLong.get(i));
		}

eu tinha pensado em ter estes métodos na classe abstracta e agora nas contas a prazo e conta à ordem

public abstract void deposit(double amount); public abstract void withdraw (double amount);

ter estes género de override

[code]@Override
public void withdraw(double amount) {
// TODO Auto-generated method stub
if (getBalance()-amount <0){
System.out.println(“You don’ have suficient founds!”);
}
else {
setBalance(getBalance()-amount);
}

	retirar();
}[/code]

sendo que esse código não funca mas este que usei de um livro com a diferença de nao ter o private nas variaveis, funciona na perfeição

public double withdraw(double amount) { if (balance - amount < O) { System. out. println("Insufficient Funds") ; } else { balance = balance - amount; } return balance; }

alguma ideia? o return setBalance(); não funciona no meu exemplo de overrrde

portanto, recapitulando, fazer a pesquisa no array pelo nome e mudar os valores das contas consoante seja deposito ou levantamento

cumps

thanks

kra, o setBalance() e o getBalance(), não está funcionando, pq vc tem que criar uma instância da classe que eles pertencem.

Ex:

ContaPrazo conta = new ContaPrazo();

conta.setBalance(10);
conta.getBalance();

logo eu vou tentar sua solução e depois mando feedback,

obrigado !! :slight_smile: