Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida referente a aplicação de interfaces

Olá pessoal eu estava pensando no exemplo de contas...supondo que eu tenha as classes ContaCorrente e ContaPoupanca . Elas possuem um comportamento parecido: saca, deposita, transfere.

Poderia criar então uma interface ContaBancaria mais ou menos nesses moldes:

public interface ContaBancaria {
    public void saca(double valor);
    public void deposita(double valor);
    public void transfere(double valor, ContaBancaria outraConta);
}

Mas ai eu decidi criar uma classe chamada ContaRefeicao, por exemplo. A classe ContaRefeicao não deixa eu transferir valor para outra conta, logo eu não poderia mais usar a interface ContaBancaria. Qual seria a melhor maneira para resolver essa situação?

Até pensei em criar uma outra interface(Conta, por exemplo) que não possua o método transfere:

public interface Conta {
    public void saca(double valor);
    public void deposita(double valor);
}

e ai as classes ficariam com algo parecido com isso:

public class ContaCorrente implements Conta, ContaBancaria {
    @Override
    public void deposita(double valor) {
        // TODO Auto-generated method stub

    }

    @Override
    public void transfere(double valor, ContaBancaria outraConta) {
        // TODO Auto-generated method stub

    }

    @Override
    public void saca(double valor) {
        // TODO Auto-generated method stub

    }
}


public class ValeRefeicao implements Conta {

    @Override
    public void saca(double valor) {
        // TODO Auto-generated method stub

    }

    @Override
    public void deposita(double valor) {
        // TODO Auto-generated method stub

    }
}

Essa seria uma solução válida? Existe alguma melhor?

Desde já agradeço.

4 respostas
solução!

Bom dia Fábio, tudo bem?

No seu caso ao invés de utilizar interfaces eu usaria as classes abstratas, porque além de você manter uma relação de hierarquia entre as classes (porque 'ContaBancaria' e 'ContaRefeicao') nada mais são do que 'Conta', vc também aplicaria o relacionamento "é-um".

Com relação ao método "transfere" eu deixaria ele opcional para ser implementado. Meus métodos abstratos seriam apenas o saca e deposita.

Espero ter te ajudado. Obrigado e bons estudos. ;)

Eu não entendi o que você quis dizer com deixar o método "transfere" opcional. É colocar uma implementação comum na classe abstrata "Conta" (acho que não é isso porque nesse caso a "ContaRefeicao" herdaria o método né?) ou seria colocar direto na implementação na implementação da classe "ContaCorrente" e "ContaPoupanca" (nesse caso como garantir que elas teriam sempre o método "transfere"?)

Talvez eu não tenha entendido direito também, poderia explicar melhor por favor? Obrigado :)

Eu novamente...kkk Seguindo a sua dica, eu cheguei ao seguinte código:

class ContaCorrente extends Conta implements ContaBancaria {
    public void saca(double valor) {...}
    public void deposita(double valor) {...}
    public void transfere(double valor, ContaBancaria outraConta) {...}
}

class ContaPoupanca extends Conta implements ContaBancaria {
    public void saca(double valor) {...}
    public void deposita(double valor) {...}
    public void transfere(double valor, ContaBancaria outraConta) {...}
}

class ContaRefeicao extends Conta {
    public void saca(double valor) {...}
    public void deposita(double valor) {...}
}

abstract class Conta {
    public void saca(double valor);
    public void deposita(double valor);
}

interface ContaBancaria {
    public void transfere(double valor, ContaBancaria outraConta);
}

Agora a classe abstrata "Conta" possui os métodos abstratos "saca" e "deposita" e todas as classes que são filhas da classe "Conta" implementam esses métodos. Para resolver o problema do método "transfere" eu criei uma interface "ContaBancaria" e fiz com que as classes "ContaCorrente" e "ContaPoupanca" implementassem ela, garantindo que elas tenham esse método. A assinatura dele ficou assim:

public void transfere(double valor, ContaBancaria outraConta);

O que acham?

A idéia é essa, Fábio. Pense na idéia de que Conta Corrente, Conta poupança e Conta Refeição nada mais são do que Contas. Porém apenas as duas primeiras possuem um comportamento a mais que é o de transferir valor. Desculpe não ter explicado o que eu queria dizer com o "opcional".

Abraços e bons estudos.