Herdar interfaces

Pessoal, estou iniciando em OOP.

Gostaria de herdar a classe ResultSet, pois vou sobreescrever o método next, last, etc, para que preencha a classe herdada, que conterá os atributos da tabela, ou seja, vou criar uma classe Cliente, com um metodo selecionar. Quando há mais de um registro ele vai poder navegar na classe auxiliar nav dentro de Cliente, ex.: cliente.nav.next(), mas essa Nav era pra ser herdada de ResultSet, e eu interceptaria o next para preencher os métodos da classe mãe. Para que Nav saiba quem é a classe mãe, também eu criaria um parâmetro parent… O que acham?

Oi,

O que deseja fazer é no mínimo estranho, você terá uma classe chamada Cliente, que terá uma lista de clientes? Por que não pensa em uma segunda classe sendo um repositório de clientes onde poderia consultar uma lista de clientes, navegar entre eles, localizar um cliente por formas diferentes ( por nome, ID, CNPJ ), não pense que POO é somente usar os recursos (herança, polimofismo…), mas sim usa-los de maneira correta (com coesão e baixo acoplamento). Pesquise sobre alguns padrões de projeto, Repository neste caso seria uma boa, você teria sua classe Cliente e uma outra onde poderia obter seus clientes ClienteRepository.

dê uma pesquisada neste padrão e outros associados a ele (DAO, Query Object).

Então, mas resumindo, é possível herdar essa interface Resultset?

Uma classe não pode herdar uma interface, uma classe só herda outra classe. No caso de interface a classe implementa seus métodos.
Só uma interface pode herdar uma outra interface.

Ahhh, eu até já sabia isso, o que me intriga é o fato de ResultSet ser uma interface, e mesmo assim, ter código executável atrelado a ela, ex, método next()… então pq será que uma interface, que deveria ser apenas um protótipo, possui poder de ação?

public interface ResultSet

isto é o que está na API JAVA

Sim, mas você não instância um ResultSet diretamente como faz com uma classe.

Para instanciar um tipo ResultSet você precisa de um Statement

[code]

Sim, mas você não instância um ResultSet diretamente como faz com uma classe.

Para instanciar um tipo ResultSet você precisa de um Statement


//Supondo que Statement st já tenha sido instaciado

ResultSet rs = st.executeQuery("select * from tb_tabela"); // O método executeQuery retorna um ResultSet 

Dá uma olhada na API vê se te ajuda

http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html

abraços!

Oi.
Não entendi muito bem. Código executável atrelado à ela? Sendo uma interface ela não pode imlementar quaisquer métodos, somente assinaturas. Não é protótipo, são só as assinaturas.

Não entendi quando você falou de poder de ação. Ela não faz nada, a não ser declarar os métodos. Você deve estar se perguntando qual o objetivo de uma interface. Acredito que o principal objetivo da interface é estabelecer um contrato entre as classes. Espero que alguém com uma boa carga de conhecimento possa dizer ao certo como funciona :slight_smile:

Toda e qualquer interface apenas estabelece um contrato.
Nunca existirá “codigo executável atrelado a ela”, seja lá o que isso quer dizer.

O que vc deve estar confundindo é que, quando fazemos isso:

ResultSet rs = stmt.executeQuery(...)

O método executeQuery está retornando um objeto de uma classe concreta, que implementa a interface ResultSet.
Isso é um exemplo do uso de polimorfismo.

Faça uma pesquisa por polimorfismo que entenderá melhor!

Ahhhh, agora sim… estava despercebendo totalmente esse fato… a classe que executa o código não é ResultSet, e sim da interface ResultSet… mesmo assim gostaria de user aquele método next() para navegar em um ResultSet meu… mas não sei que classe herdar, mas tudo bem… eu faço tudo de novo rsrsrsrs

Você pode usar alguma das subclasse de ResultSet.

CachedRowSet, FilteredRowSet, JdbcRowSet, JoinRowSet, RowSet, SyncResolver, WebRowSet

O método next() estará implementado em qualquer uma. Agora cabe a você ver que maneira quer que seja feito (olhando nos métodos next() das subclasses). Pode ser que eles façam alguma coisa diferente um do outro, como pode ser que também não façam.

Tem certeza? Eu acho que é uma subclasse de Statement que executa alguma coisa e esse ResultSet rs que o zinho colocou acho que serve para o polimorfismo.
Olha, eu não sei… eu nunca usei isso, mas pelo menos é o que eu acredito ser, baseado no meu fraco conhecimento sobre interfaces.