4
respostas

Dúvidas no exercício Ordem Natural

Bom dia,

No exercício de Ordem Natural, no passo 2 diz "Repare que agora somos forçados a implementar o método que a interface nos impõe, compareTo() e vamos implementar nossa lógica de comparação:", só que no meu código a classe Conta é abstrata e a IDE (Eclipse) não reclama, quem reclama são as classes que estendem ela (ContaCorrente e ContaPoupanca) e eu implementei o método compareTo nelas, porém verificando o código que eu baixei do capítulo 8, o método é implementado na classe Conta.

1- Onde devo implementar o método compareTo? Na classe Conta ou nas classes que estendem ela (ContaPoupanca e ContaCorrente)?

2- Há também a classe ContaEspecial, do pacote br.com.bytebank.banco.especial, que também pede a implementação do método compareTo, só que o atributo saldo da classe Conta está como protected e ContaEspecial não tem acesso por não estar no mesmo pacote. Como resolver?

Pra deixar claro, o que me deixou confuso no exercício foi o "Repare que agora somos forçados a implementar", eu achava que a classe Conta ia forçar a implementação do método, não as classes que a estendem.

4 respostas

Boa tarde flávio, tudo bem?

O método compareTo() faz parte da interface Comparable e quem implementa esta interface é a classe Conta. Toda vez que uma classe implementa uma interface ela é obrigada a implementar os seus métodos, portanto a método compareTo() deve ser implementado dentro da classe Conta.

//Todos este colocados aqui são do capítulo 8

public abstract class Conta extends Object implements Comparable<Conta>{

//Dentro dela existem os outros métodos criados nela e o compareTo()...

 @Override
    public int compareTo(Conta outra) {
            return Double.compare(this.saldo, outra.saldo);
    }...

ContaPoupanca e ContaCorrente não implementam a interface Comparable, apenas extendem a classe Conta, juntamente seus métodos e atributos, inclusive o método compareTo() e sua implementação que foi realizada dentro da classe Conta. Para perceber isso basta observar a suas assinaturas.

public class ContaCorrente extends Conta implements Tributavel {...

public class ContaPoupanca extends Conta{...

Ambas não tem em sua assinatura a implementação da interface Comparable. Destaque para ContaCorrente que possui sim uma implementação mas de outra interface chamada Tributavel, que possui o método getValorImposto que deve ser implementado dentro desta classe.

Para resolver o problema com ContaEspecial, basta importar o pacote onde está a classe Conta, para dentro dela.

import br.com.bytebank.banco.modelo.Conta;

Muito obrigado pela resposta Felipe, muito completa por sinal!

Como eu disse, o que me deixou confuso foi que ao adicionar "implements Comparable" na classe Conta, o Eclipse não reclama nada na classe Conta, isso que achei estranho. Conversando com alguns amigos, eles disseram que o Eclipse não reclama pelo fato da classe Conta estar definida como abstrata, portanto o enunciado que diz "somos forçados" não me parece correto.

Você chegou a testar isso que eu estou dizendo? Mesmo que você coloque "implements Comparable" na classe Conta e salve, para o Eclipse tá tudo correto!

Exato, pelo fato da Classe Conta ser uma classe abstrata, por si só, ela não é capaz de fazer uso dos métodos declarados nela, eles só podem ser utilizados pelas subclasses que a herdarem(ContaCorrente, ContaPoupanca e ContaEspecial) isso se aplica também para os métodos que a esta classe recebe de interfaces .

Portanto para o compilador não há problema a classe Conta implementar a interface Comparable e não sobrescrever o método compareTo(), já que ele "sabe" que ela não consegue utilizar este método mesmo, e por isso ele indica o erro de compilação nas suas subclasses, que de fato podem fazer uso dele.

Entendi, é que para mim não fica claro no enunciado que a implementação do método compareTo tem de ser na classe Conta justamente pelo "ser forçado", nas subclasses somos forçados, mas vou fazer as correções conforme você orientou, muito obrigado!