UML Projeto dúvidas

Ola amigos estou com varias dúvidas em uma prova que fiz (e fui muito mal) um tempo atrás, e gostaria de ajuda, se for possivel.

O diagrama:

        <abstract>
	Conta

-nome String
-numero int
-saldo float
-limite float


+construtores
+sets e gets
+limiteUtilizado():float
+sacar(valor):void
+depositar(valor):void


Herda da classe conta


Conta Corrente


+construtores
+getSaldo():float


Herda da classe conta


Poupanca


  • juros: float
    +sets e gets
    +limiteUtilizado():float

interface relacionado com Poupanca


   <<interface>>
Rendimento

+atualizaSaldo(meses):void


São 5 questões, mas vou colocar uma de cada vez para não poluir muito

[color=red]1)Crie uma classe abstrata de nome Conta que armazene dados privados para nome, número
saldo e limite da conta. Crie métodos set e get e dois construtores com e sem parâmetros
e os métodos abstratos para sacar e depositar. Além disso, escreva o método limiteUtilizado para retornar o valor do limite
que está sendo utilizado, caso o limite não esteja sendo utilizado retorne 0. [/color]

Na 1ª questão fiz o seguinte:


public abstract class Conta {

    private String nome;
    private int numero;
    private float saldo;
    private float limite;

    
    Conta(){
      
    }
    
     Conta(String n,int num,float s,float l){
      n = nome;
      num = numero;
      s = saldo;
      l = limite;
    }
    
    public float getLimite() {
        return limite;
    }

    public void setLimite(float limite) {
        this.limite = limite;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public float getSaldo() {
        return saldo;
    }

    public void setSaldo(float saldo) {
        this.saldo = saldo;
    }
    
     public float limiteUtilizado(){ //método concreto
       
         return limite;
    }
    
    
    public abstract void sacar(); //método abstrato
    public abstract void depositar(); //método abstrato
    
}

[color=green]Minha 1ª dúvida é na parte dos métodos abstratos para sacar e depositar, [/color]

[color=red] +sacar(valor):void
+depositar(valor):void[/color]

pois quando colocava valor dentro dos parenteses dava um erro:


public abstract void sacar(valor); //método abstrato
public abstract void depositar(valor); //método abstrato

Tudo parece estar certo, você definiu a classe como abstrata também, o que a maioria não lembra.

Coloque o Tipo do parâmetro na função

public abstract void sacar(int valor); //método abstrato

Através do diagrama, como é que você sabe que “valor” é int não poderia ser double ou float?

Na minha 2ª dúvida é na parte

[color=red] Além disso, escreva o método limiteUtilizado para retornar o valor do limite
que está sendo utilizado, caso o limite não esteja sendo utilizado retorne 0. [/color]

Bom fiz assim, mas creio que esteja errado

 public float limiteUtilizado(){  
         
         return limite;  
    }  

Seguinte:

Não sei se valor e Inteiro, so coloquei por exemplo o Inteiro ok, você pode coloca-lo como Object, dai vira um método genérico, aceita qualquer tipo primitivo.

public abstract void sacar(Object valor);

[code]
float limit=0f;

//Aqui metodos usando a variável limite, retornando alguma coisa

public float limiteUtilizado(float limite){
float discriminador = 0f;
if(limite.equals(discriminador))
return limite

else
return limite

}[/code]

Então mas no caso o limiteUtilizado é do tipo float e somente strings pode utilizar equals, não é?
E no diagrama não vi limite dentro do parenteses, não teria que utilizar o que foi declarado?

Conta


-nome String
-numero int
-saldo float
[color=blue]-limite float [/color]


+construtores
+sets e gets
[color=red]+limiteUtilizado():float [/color]
+sacar(valor):void
+depositar(valor):void


Obrigado

Ja na outra questão entra interface, que é uma das coisas que não consigo entender muito bem, mesmo lendo uma porrada de
tutoriais:

[color=red]
2) Crie uma interface de nome Rendimento que possui a assinatura do método atualizaSado(meses), que irá atualizar o saldo da poupança baseado no número de meses recebido e o valor mensal dos juros. (saldo = saldo+saldo*(juros*meses)/100)
[/color]

Na prova fiz assim:



public interface Rendimento {
   public void atualizaSaldo();    
}

Com base do que foi explicado acima tentei novamente fazer :



public interface Rendimento {
   public void atualizaSaldo(int meses);  
 int saldo = 0;
 
 saldo = saldo + saldo*(juros*meses)/100;
   
}

Mas ta dando erro

Você não pode implementar um método em uma interface, uma interface e composta apenas de métodos abstratos.
Você herda o escopo do método da interface, e ai você implementa.

Cara se seu método não tiver um parâmetro de entrada para verificar o limite, o limite terá que ser uma variável global.

Foi o que imaginei, então ficaria somente assim?



public interface Rendimento {
   public void atualizaSaldo(int meses);  
 
   
}

Na interface sim, ai você herda a interface e implementa o método na classe que a herdou, obedecendo esse escopo declarado na interface.

Nessa questão também uma dúvida

[color=red]
3) Crie uma classe de nome ContaCorrente com os construtores. Além disso, sobreescreva o método getSaldo para retornar o saldo acrescido do limite da conta.
[/color]



public abstract class ContaCorrente extends Conta {

    public ContaCorrente(String n, int num, float s, float l) {
        super(n, num, s, l);
    }

    public ContaCorrente() {
        
    }

    @Override
    public float getSaldo() {
        return super.getSaldo();

    }
    
    
}


[color=blue]
Essa daqui também é um problema, não consigo sobreescrever o método getSaldo para retornar o saldo acrescido do limite da conta?
[/color]

Você não vai sobrescrever, voce vai e implementar seguindo o escopo da interface, e lembrando, interface você não extende (extends), você implementa (implements), acho que devo ter me equivocado e dito, extender em algum lugar ai.

Como está o método na classe Conta, para sobrescrever basta, alterar o tipo do parâmetro, ou adicionar outro por exemplo, da uma pesquisada que você acha.

[quote=supergelson]Através do diagrama, como é que você sabe que “valor” é int não poderia ser double ou float?
[/quote]

Pelo diagrama vc não sabe porque ele está mal feito. Nã oestá escrita a declaração do que o valor seria.
Pelo contexto seria float porque o diagram está usando float para valores de dinheiro. Isto vc teria que inferir.

Não estou dizendo que é correto vc inferir , mas no caso seria necessário. no mundo real vc falaria com quem fez o diagrama e reportaria o problema do valor não estar definido

(Nota: nunca no mundo real use float ou double para representar dinheiro. Isto é apenas um exercício.)

[quote=sergiotaborda][quote=supergelson]Através do diagrama, como é que você sabe que “valor” é int não poderia ser double ou float?
[/quote]
(Nota: nunca no mundo real use float ou double para representar dinheiro. Isto é apenas um exercício.)[/quote]

Desculpa entrar no tópico sem algo a acrescentar além da minha dúvida. sergiotaborda, qual seria então a forma de utilização numa aplicação real?

Muito obrigado pela dica sergiotaborda

lpbianco,

Classe conta é essa e não é interface



public abstract class Conta {

    private String nome;
    private int numero;
    private float saldo;
    private float limite;

    Conta() {
    }

    Conta(String n, int num, float s, float l) {
        n = nome;
        num = numero;
        s = saldo;
        l = limite;
    }

    public float getLimite() {
        return limite;
    }

    public void setLimite(float limite) {
        this.limite = limite;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public float getSaldo() {
        return saldo;
    }

    public void setSaldo(float saldo) {
        this.saldo = saldo;
    }

    public float limiteUtilizado(float limi) {
        float discriminador = 0f;


        if (limi == discriminador) {

            return limi;

        } else {
            return limi;


        }

    }

    
    
    
    
    
    public abstract void sacar(); //método abstrato
    public abstract void depositar(); //método abstrato
}

[color=blue]Ja a classe conta fiz assim[/color]

public abstract class ContaCorrente extends Conta {  
  
    public ContaCorrente(String n, int num, float s, float l) {  
        super(n, num, s, l);  
    }  
  
    public ContaCorrente() {  
          
    }  
  
    @Override  
    public float getSaldo() {  
        return super.getSaldo();  
  
    }  
      
      
}  

[color=red]Então acho que implements não funcionaria,

O exercicio pede para criar uma classe ContaCorrente e sobreescrever o método getSaldo e acrescentar o limite, isso que não consigo fazer
[/color]

  1. Crie uma classe de nome ContaCorrente com os construtores. Além disso, sobreescreva o método getSaldo para retornar o saldo acrescido do limite da conta.

[quote=Marcelo de Andrade][quote=sergiotaborda][quote=supergelson]Através do diagrama, como é que você sabe que “valor” é int não poderia ser double ou float?
[/quote]
(Nota: nunca no mundo real use float ou double para representar dinheiro. Isto é apenas um exercício.)[/quote]

Desculpa entrar no tópico sem algo a acrescentar além da minha dúvida. sergiotaborda, qual seria então a forma de utilização numa aplicação real?[/quote]

O padrão Money.

O padrão money é um objeto especial que lida com dinheiro com regras melhores e representação melhor. A forma mais simples usa um long para guarda centavos e dessa forma nunca haver perda de precisão.
Existem outras formas que usam outras representações internas, mas o ponto do padrão é usar uma estrutura especifica para lidar com dinheiro. Quando vc usa String não usar array de char. A String, embora sendo um array de char lá dentro ajuda a abstrair um monte de coisas e é muito mais simples de usar. O mesmo entre o Money e double , float ou bigdecimal