Polimorfismo

6 respostas
M

Olá pessoal a minha dúvida é a seguinte, possuo uma classe abstrata Conta:

public abstract class Conta{
    
    protected String Cliente;
    protected double saldo;
    protected double taxas;
    
    void conta(String nome, double saldo){
        this.Cliente = nome;
        this.saldo = saldo;
    }
    
    void deposita (double valor)
    {
        if(valor > 0){
        this.saldo += valor;
                     }
        else
            throw new IllegalArgumentException("ESSE SALDO NÂO PODE SER DEPOSITADO");
    }
    
    void saca (double valor){
        if(valor > this.saldo){
            throw new IllegalArgumentException("Saldo insuficiente"); 
        }else {                                                     
            this.saldo -= valor;
        }
    }
    
    double getSaldo(){
        return  this.saldo;
    }
    
   abstract double  taxa (double taxa);
      
      
}

Que tem duas filhas a ContaCorrente:

public class ContaCorrente extends Conta implements Tributavel{
    
    @Override
      double taxa (double taxa){
        this.taxas +=  (taxa * 2);
        return this.taxas;
    }

    @Override
    public double calculaTributos() {
           return this.getSaldo() * 0.01 + this.taxas;
    }
      
}

e a ContaPoupança:

public class ContaPopança extends Conta{
    
    
    
    @Override
    double taxa (double taxa){
        this.taxas +=  (taxa * 3);
        return this.taxas;
    }
       
}

Gostaria de saber porque não posso usar o construtor da classe mãe Conta, para iniciar valores na ContaCorrentes quando a inicializo:

public class Banco {

    public static void main(String[] args) {
          
        
        ContaCorrente cc = new ContaCorrente("matheus", 5465.21);
        
        
    }
}

6 Respostas

FelipeWM

Boa Tarde Mathe,
Você não poderá utilizar o construtor da classe Conta, pois como ela é uma classe Abstrata você só poderá utilizar os atributos e os métodos dela.
Abraço.

jrmelo

Mathe

Oi.
Para tal situação você precisará fazer algumas alterações, são:

  1. Criar um construtor com argumentos na classe Conta e métodos de retorno;
  2. Criar um construtor na classe Conta Corrente para receber os argumentos, nesse mesmo passar os argumentos ao construtor da classe superior dentro super();

Então ficaria assim:
Para classe Conta.

public Conta(String nome, double saldo){  
	        this.cliente = nome;  
	        this.saldo = saldo;  
	    } 

public double getSaldo(){  
	        return  this.saldo;  
	    }  
	    
	    public String getCliente(){
	    	return this.cliente; 
	    }

Para classe ContaCorrente

public ContaCorrente(String nome, double saldo) {
		super(nome, saldo);
		// TODO Auto-generated constructor stub
	}

Classe Banco:

ContaCorrente cc = new ContaCorrente("matheus", 5465.21);  
        
        System.out.println("Taxa...:" + cc.taxa(3.2));
        System.out.println("Cliente....:" + cc.getCliente());
        System.out.println("Saldo.....:" + cc.getSaldo());

Quem mata a cobra mostra ela morta, segue o resultado, anexo.

Observação: Não sei se é uma boa prática de desenvolvimento. Devido haver repetições de código, pois os argumentos passam pela classe estendida para chegar na classe superior. Diferentemente, se usar um método na classe estendida ou superior, que atualiza as variáveis de instância no lugar onde definido, além de pode invocá-lo quantas vezes quiser. Não obstante, depois da classe ser construída. Que puder analisar, se é boa prática ou não, por favor comentar.
Mas, que funciona, funciona.

M

Mas no caso ali velho eu nem precisaria usar a palavra chave super pois eu queria atribuir aos atributos da classe conta corrente mesmo, mas ja matei minha duvida, se a classe conta não fosse abstrata eu poderia usar o construtor então?

jrmelo

Uma classe abstract não pode ser instanciada nunca, o seu propósito é ser subclassificada. Se ela não fosse do tipo abstract, poderia utilizar sim, além do construtor com argumento teria que fornecer um sem argumento. Do contrário, teria que explicitar a chamada a super dentro do construtor da subclasse.

Abraço.

ErickRAR

Quando for instanciar, por boa prática, procure fazer :

Conta conta = new ContaCorrente("matheus", 5465.21);
M

Hmm, é uma pena que eu não possa usar o construtor da classe abstrata mas vo seguir os conselhos e obrigado por sanar a minha dúvida, que não tinha na apostila da caelum. vlw galera

Criado 28 de julho de 2012
Ultima resposta 28 de jul. de 2012
Respostas 6
Participantes 4