Conceito POO - Override/Overload

391 views
Skip to first unread message

Guilherme Bernardi

unread,
Nov 26, 2012, 6:03:07 AM11/26/12
to androidb...@googlegroups.com
Bom dia pessoal.

Estou desenvolvendo um aplicativo utilizando uma classe de persistência. Que seria a super classe e as demais classes herdam ela para persistir os dados no banco. Sou novato em programação POO e estou com dúvidas em um conceito e como fazer isto no Java para que ele interprete da maneira correta, se alguém puder me ajudar ou pelo menos explicar ficarei muito grato.

Seguinte:

Eu tenho uma classe de Persistencia, que possui o método Grava(). Neste método ele seta o banco e verifica um status Enum que eu controlo dentro das classes de atributos o que ele deve fazer, Insert, Update e Delete e executa a ação no banco.

E eu tenho 2 classes, Pedido e PedidoItem que herdam a classe de Persistencia.
Ambas tem o método Grava() também, mas assumem assinaturas diferentes:

- Método Grava() da Classe Pedido é responsável por carregar os dados na persistência e efetuar a sua gravação e já contar os itens chamando o método Grava() da classe PedidoItem para gravar item a item. O detalhe é que ambas as chamadas de Grava() devem carregar os dados e chamar o método da Persistencia. Mas em termos conceituais devo ter feito algo bem errado, gostaria de saber qual é o certo e como funcionaria.

Obrigado desde já.

Lucas Xavier

unread,
Nov 26, 2012, 6:21:27 AM11/26/12
to androidb...@googlegroups.com
Pelo que você explicou, essa situação é "Override" de métodos.

O Override acontece quando uma subclasse sobrescreve o método da classe pai, geralmente para fornecer uma implementação específica.

Já Overload é quando na mesma classe existem métodos com nomes iguais, mas assinaturas diferentes. Por exemplo, um construtor sem parâmetros e um com parâmetros para inicialização de variáveis. 

--
Atenciosamente,

Lucas Xavier


--
 
 

Cleber - Android Developer

unread,
Nov 26, 2012, 6:33:53 AM11/26/12
to androidb...@googlegroups.com
Eu aconselho você a estudar sobre DAO (Data access object). No mundo java ate agora eu acho a melhor estrutura para gerenciar persistência.

Já a sua duvida o "Gravar()" por padrão de convenção seria "gravar()" (Obs: Método e variáveis sempre começa com letras minusculas).
Quando a classe filha possui uma método com o mesmo nome da classe pai, ela vai sobrescrever o que a classe pai faz. (Se não me engano nas versões anteriores você é obrigatório anotar o @Override).
Caso você queria executar o método da classe pai você deverá utilizar o super.gravar(); Exemplo.

@Override
public void gravar(){
   super.gravar();
   ...
}

Outra situação que você devera ficar atento é assinatura do método. Quando existe um método gravar(Pedido ped) e o gravar(Produto prod), são coisas diferentes para o java. Neste caso não há Override no método gravar, e sim dois métodos diferentes.


Abraço e sucesso!




--
 
 

Guilherme Bernardi

unread,
Nov 26, 2012, 6:34:43 AM11/26/12
to androidb...@googlegroups.com
Obrigado Lucas, sim seria Override.

Uma outra dúvida que eu tenho:

Eu tenho o Grava() da classe de Persistencia.
o Grava() da classe de Pedido e o Grava() da classe de PedidoItem.

No caso o método a ser sobrescrito é o Grava() da Persistencia, correto?
Então o ideal é ele possuir a annotation @Override?

Guilherme Bernardi

unread,
Nov 26, 2012, 6:39:54 AM11/26/12
to androidb...@googlegroups.com
Obrigado, Clebão.

Quando postei perguntando sobre a annotation, você postou.
Entendi, obrigado pelos esclarecimentos e vou procurar estudar DAO.

Lucas Xavier

unread,
Nov 26, 2012, 8:18:42 AM11/26/12
to androidb...@googlegroups.com
Isso Gulherme. 

Mas lembrando que nesse caso sua classe deve herdar da classe Persistencia.


--
Atenciosamente,

Lucas Xavier


--
 
 

Fred

unread,
Nov 26, 2012, 9:55:17 AM11/26/12
to androidb...@googlegroups.com
A anotação @Override é colocado na classe filha, no método que esta de fato sobrescrevendo, e não na mãe, no seu caso o @Override vai no método grava() da classe Pedido.

--
 
 



--
"Frederico Ferrão da Silva"

gabriel...@gmail.com

unread,
Nov 26, 2012, 9:55:48 AM11/26/12
to androidb...@googlegroups.com
Cria a função " grava() " vazia na classe de persistencia, e sobre-escreve ela na classe pedido, e pedido item.

Se você não vai instanciar a classe Persistencia em nenhum lugar, apenas extende-la em outras classes, você pode criar ela como classe abstrata, e deixar o método "grava" como abstrato, forçando as subclasses a implementa-la.
Se você quiser especificar um trecho de código especifico na função "grava" da classe persistencia, dentro das subclasses use o  super.gravar() para acessar.




------------------------------------------------------------------
Att. Gabriel Molter
http://twitter.com/gabriel_molter
gabriel dot molter at gmail dot com
GNU/Linux User #511488
-------------------------------------------------------------------



--
 
 

gabriel...@gmail.com

unread,
Nov 26, 2012, 10:05:23 AM11/26/12
to androidb...@googlegroups.com
Sobre a implementação com classe abstrata, fiz um exemplo e colei no pasteBin




------------------------------------------------------------------
Att. Gabriel Molter
http://twitter.com/gabriel_molter
gabriel dot molter at gmail dot com
GNU/Linux User #511488
-------------------------------------------------------------------



--
 
 

Guilherme Bernardi

unread,
Nov 26, 2012, 10:21:26 AM11/26/12
to androidb...@googlegroups.com
Opa, muito obrigado a todos.

Esclareceram minhas dúvidas.
Então a classe de Persistencia não podia ser abstrata porque ela é responsável por chamar os comandos de banco de dados, ela que faz essa comunicação com a classe do BD.

No métodos de gravação de Pedido e PedidoItem eu apenas carrego os atributos da Persistencia e chamo o super.grava().
Funcionou normalmente.

Exemplo método Grava() da classe Pedido:

@Override
public void Grava(){
if (this.getItensCount() <= 0) {
//Exceção não implementada.
} else{

this.setContexto(this.getContextoPedido());
this.Dados = new ContentValues();
this.setTabela(this.getClass().getSimpleName());
this.setTabelaColunaComposta(null);
this.setTabelaSelecao("Numero = " + this.getNumero().toString());
this.Status = eStatus.Insert;
this.Dados.put("Numero", this.getNumero().toString());
this.Dados.put("Data", this.getData().toString());
this.Dados.put("Emissao", this.getEmissao().toString());
this.Dados.put("Comprador", this.getComprador().toString());
this.Dados.put("Representante", this.getRepresentante().toString());
this.Dados.put("TipoPedido", this.getTipoPedido().toString());
this.Dados.put("TipoFaturamento", this.getTipoFaturamento().toString());
this.Dados.put("TipoFrete", this.getTipoFrete().toString());
this.Dados.put("Obs", this.getObs().toString());
this.Dados.put("EmpDestinataria", this.getEmpDestinataria().toString());
this.Dados.put("FormaPagamento", this.getFormaPagamento().toString());
super.Grava();
for(int i = 0; i < this.getItensCount(); i++) {
this.Itens.get(i).Grava();
}
}
}

Creio que agora ficou correto.

Eu estou tendo um outro problema, com a classe PedidoItem pois ela implementa Parcelable (Eu preciso transmiti-lá entre as activities e carregá-la em um listview). E eu dependo do Context para carregá-lo na persistência para utilizá-lo no construtor do SQLite para persistir os dados.
Não sei exatamente como costumam trabalhar com o Context neste caso com SQLite.
Mas não estou conseguindo passar o Context ou encontrar uma maneira ideal e conceitualmente correta para passá-lo via Parcel.
Estou procurando algo na internet, mas se não encontrar acho que o ideal era abrir um outro tópico para ver se alguém teve problema semelhante.

Obrigado a todos pela ajuda.
Reply all
Reply to author
Forward
0 new messages