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!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software