Sumindo com função do Obj Pai

45 respostas
F

Pessoal,

Tenho uma classe Pai e uma Filho, senho que Filho herda do Pai.

A classe pai tem uma função disparar();
A classe filho tem uma função disparar(int Idade);

O problema é o seguinte, quando instancio a classe Filho ela me dá a opção de chamar “disparar()” ou “disparar(int Idade)”. Eu gostaria de sumir com a função disparar() e permitir que o usuário somente chame a função que possui parametro. No Delphi eu consigo fazer isso com um “reintroduce”. Como fazer isso em java?

Agradeço,
Fábio.

45 Respostas

jgbt

herança é p/ isso… va não pode sumir com o metodo.
e não é o mesmo metodo, vc sobrescreveu ele.
vc pode declara-la como private na classe pai, com isso não vai enxerga-la na classe filha, mas não vai chamar o metodo fora da classe pai.
ou deixa-la sem modificador de acesso(default), e colocar a classe filha em outro pacote.
qual a real necessidade disso?

[]'s

F

Na realidade eu tenho uma classe Pai qualquer, na outra mensagem foi só um exemplo, que varias classes herdam dele e reutilizam o disparar(), mas tenho uma outra classe que teria que reimplementar toda a função disparar(). Se eu não tivesse que passar parametro seria facil pq eu simplesmente não chamaria o metodo “super”. Mas como nesse “novo” disparar eu preciso de parametro eu não consigo eleminar a implementação inicial da classe pai. Conseguiu entender?

jgbt

mas pq vc precisa “eliminar” a implementação inicial da classe pai?
se o filho não pode chamar um metodo do pai, acho que vc precisa rever sua implementação.

[]'s

Rafael_Steil

Voce precisa de um disparar() com parametros? Entao crie o metodo com parametros na classe filha apenas (overloading).

Rafael

F

Não é que não pode, poder pode, mas não é o objetivo. Ficaria uma função disponivel sem ter sentido ela ser executada, pq a classe filho implementa novas funções e algo mais avançado. Disparar essa função seria melhor instanciar Pai e não Filho. Queria somente “limpar” as chamdas que não interessam realmente para o filho.

pcalcado

Oi,

Em java voce nao vai conseguir esconder uma caracteristica com heranca (descendant hiding). Siga o que o Rafael falou.

mister_m

fabio.candia:
Não é que não pode, poder pode, mas não é o objetivo. Ficaria uma função disponivel sem ter sentido ela ser executada, pq a classe filho implementa novas funções e algo mais avançado. Disparar essa função seria melhor instanciar Pai e não Filho. Queria somente “limpar” as chamdas que não interessam realmente para o filho.

Se você quer “orientar” o usuário a não chamar este método na classe filha, sobrescreva e marque como @deprecated.

F

Seria uma solução. E como faço para marcar uma função como “deprecated”?

mister_m

Assim:

/**
 * @deprecated
 */
public void metodo() {
//...
}

Note o /**, com dois asteriscos. É importante :slight_smile:

cv1

Alias, isso nao eh mais ou menos o que aconteceu com o Statement.execute(String) e PreparedStatement.execute(), so que ao contrario?

Eu lembro quase ter me jogado do predio depois de ter perdido um tempo consideravel tentando entender o que eu tava fazendo de errado, ate ver que tinha chamado PreparedStatement.execute(String)

mister_m

cv:
Alias, isso nao eh mais ou menos o que aconteceu com o Statement.execute(String) e PreparedStatement.execute(), so que ao contrario?

Sim. Em ambos os casos a hierarquia não foi desenhada corretamente :stuck_out_tongue:

O que não dá pra aceitar até hoje é que não existe uma interface comum pra PreparedStatement e CallableStatement abstraindo os set*(…) da vida.

F

Valew pessoal, marcando como “depreaced” ajuda. Deu certim.

renatosilva

Curiosidade, como é isso no Delphi?

jgbt:
herança é p/ isso… va não pode sumir com o metodo.
e não é o mesmo metodo, vc sobrescreveu ele.

Não concordo com o que estão dizendo aqui. O cara não quer sumir com o método, só quer alterar os parâmetros, o método é o mesmo. Isso pra mim é apenas polimorfismo. Fábio, porque você não sobreescreve o método sem parâmetros nas classes filho como private, e aproveita e marca como “em desuso” como já disseram (se bem que não seria apenas isso, a linguagem deveria talvez fornecer um meio de você “reorganizar” os parâmetros)?

mister_m

Nada disso. Em Java, métodos são identificados pelo nome e pelos tipos dos parâmetros. São métodos totalmente distintos do ponto de vista do compilador e da JVM

Polimorfismo paramétrico, o pior nome que podiam dar pra algo assim, por sinal :frowning: Só confunde as pessoas…

Porque depois não vai compilar :mrgreen: Não é possível diminuir a visibilidade de um método.

Não. Na verdade, provavelmente o modelo de classes do nosso amigo está errado para o que ele está tentando fazer e ele deveria usar composição ao invés de herança ou ainda extrair uma classe comum a partir das quais as duas herdassem.

cv1

Voce nao pode reduzir o nivel de acesso (de public pra private, por exemplo) numa subclasse. :wink:

renatosilva

Mas acho que não do ponto de vista da OO. A mensagem é a mesma, com um formato diferente.

Nunca ouvi essa rotulação, pra mim era apenas polimorfismo. Bom não me surpreendo porque essa coisa de OO é tão filosófico, matrixiano, marciano… Não imagino os problemas que isso poderia causar, na verdade li numa Mundo Java que métodos com diferentes parâmetros mas com o mesmo nome numa mesma classe era uma forma de polimorfismo. Putz, isso é polimorfismo sim para mim:

- Peide
- Peide(Quando?)

Acima tem apenas uma mensagem (peide!), mas com formatos diferentes.

:shock: E como é possível “privatizar” construtores?

Humm… sei lá, abstrato, subjetivo, conceitual, gnoissológico…

mister_m

De onde você tirou isso? :slight_smile: Uma coisa não tem nada a ver com a outra. O nome só identifica a mensagem se quem fizer a linguagem definir assim, oras. Em Java, foi definido que não é assim.

Nunca ouvi essa rotulação, pra mim era apenas polimorfismo.

Polimorfismo de OO não tem nada a ver com isso, senão C puro já estaria com meio caminho andado pra ser OO :wink:

Polimorfismo paramétrico, com certeza :slight_smile:

Em Java não. :slight_smile:

Explique o que você quis dizer com isso e o que isso tem a ver com reduzir a visibilidade de um método.

Humm… sei lá, abstrato, subjetivo, conceitual, gnoissológico…

No caso de uma linguagem específica, já existente, isso é bem concreto. :slight_smile:

jgbt

renato3110 wrote:

pq construtores não são sobrescritos, por isso essa regra não se aplica a eles. :mrgreen:

[]'s

renatosilva

Hummm… é mesmo!!! É mania de programar usando Create no Delphi. Eu vejo esses construtores do Java na forma do new Classe, como uma chamada a um método estático da classe “criar” como é mais ou menos no Delphi hehehehehehehh

@+ Pensando “oomente”, acho que construtor é construtor, ou seja é o mesmo método com várias formas em várias classes!!!

cv1

Concordo com voce, Renato: a partir do momento que voce comeca a chamar metodos de mensagens, a coisa faz bastante sentido e eh bastante plausivel quando voce vem do Smalltalk. Mas, como Smalltalk eh Smalltalk e Java eh Java, e infelizmente temos que ser amigos do compilador, a tipagem estatica te impede de abstrair a coisa e achar que tudo eh uma coisa so. Dai surgiu essa historia de sobrecarga de metodos. Bom, na verdade nao, mas a historia fica mais simples assim.

Alias, leitura recomendada pra qqer um que quer discutir tipagem:

http://c2.com/cgi/wiki?TypingQuadrant

:slight_smile:

renatosilva

Carlos, o link dá dando acesso negado…

renatosilva

Como assim? Está falando dos construtores?

louds

Sobrecarga de método não é polimorfismo. A própria definição de polimorfismo já descarta a possibilidade de ser.

Um método é definido pelo seu nome e argumentos, logo se os argumentos mudam, estamos falando de métodos diferentes. Métodos diferentes, cada um com uma forma só, onde está o polimorfismo disso?

renatosilva

louds:
Sobrecarga de método não é polimorfismo. A própria definição de polimorfismo já descarta a possibilidade de ser.

Um método é definido pelo seu nome e argumentos, logo se os argumentos mudam, estamos falando de métodos diferentes. Métodos diferentes, cada um com uma forma só, onde está o polimorfismo disso?

Discordo, não foi assim que aprendi polimorfismo, você está se atrelando à linguagem, não o conceito, NMO. Veja o exemplo do peido.

mister_m

louds:
Sobrecarga de método não é polimorfismo. A própria definição de polimorfismo já descarta a possibilidade de ser.

Eu concordo com você, mas diversos livros discordam :slight_smile:

As pessoas pegaram a semântica original da palavra polimorfismo - múltiplas formas - e geraram outra interpretação. Alguns livros definem isso como foi originalmente chamado, i.e., polimorfismo paramétrico, mas outras literaturas já tiraram a segunda palavra do nome, deixando os iniciantes cada vez mais perdidos…

renatosilva

Mister M, é bom descobrir que existe essa variação de interpretação, mas ae, mesmo assim eu discordo de você e do louds:

- Peidar
- Peidar(Quando?)
- Peidar(Onde?)
- Peidar(Quando?, Onde?)
- Peidar(QualCheiro?)

Putz, é tudo peido, mas cada um de um jeitinho diferente :smiley:
Caras finjam que não existe computador nem linguagens de programação, pense nos objetos do mundo real e me digam…

@+ Por falar no Mister M, eu sempre achei sem graça suas revelações.
@+ (as revelações do Mister M o mágico, não o usuário do GUJ aqui!!!)

cv1

renato, o que aconteceria no seu mundo fantastico caso voce chamasse:

local = [372951, -212319] # latitude, longitude horario = now() cheiro = Cheiros.BACALHOADA cor = Cores.ROXO vovoh.peidar(local, horario, cheiro, cor)

E nao existe nenhum metodo peidar(local, horario, cheiro, cor) na classe Vovoh?

renatosilva

Não entendi o que você quer dizer, não estou dizendo que você pode peidar de todas as maneiras possíveis, em Marte, na cara do Bush, pela boca, durante duas horas, peidar pela internet etc só porque existe a mensagem “peido”.

Mas também você não pode dizer que as diversas combinações disso são coisas completamente diferentes. É tudo peido. Os argumentos são aspectos secundários de uma mensagem. No mundo real, não tão (e tão longe de ser) maravilhoso, você “dá comandos” e “passa argumentos” de uma maneira bem dinâmica. Ou seja, para uma mensagem existir, não precisa especificar os argumentos (meio a la varargs).

Uma vovó peidar em Londres, agora, com cheiro de repolho com ovo podre e cor verde (alguém já viu com cor? :shock: ), é a mesma ação que Renato peidar hoje à tarde na Tijuca ou o cachorro peidar. Veja que é tudo peidar, várias formas diferentes de se fazer a mesma coisa: peidar. uma forma de Polimorfismo.

PS: putz estamos chegando num alto nível de conversação hein com esses peidos :mrgreen:

Claro, isso tudo é como eu compreendo as coisas, até que alguém mude meus conceitos!!

cv1

Eu nao estou discordando - so estava querendo entender qual a sua posicao em relacao a chamar metodos com parametros que nao foram declarados na(s) assinatura(s) do(s) metodo(s) existente(s). A resposta foi meio vaga - “parece varargs”, mas tudo bem, passa :smiley:

O que vc quer eh algo tipo ECMAScript (erhm, JavaScript), Python ou Ruby entao, onde os parametros que nao forem passados viram null e os que foram passados a mais sao ignorados. O problema com isso eh que nao podem existir dois metodos “peidar”. Voce teria que ter:

def peidar(local=null, horario=null, cheiro=null, cor=null): # libera o gas de mil e uma formas possiveis

edit: existem peidos coloridos, sim, e a cor predominante desses eh marrom, mas aih a gente ja entra no assunto de multimethods e metaclasses. Melhor parar por aqui :mrgreen:

louds

Michael, não conheco nenhum livro bom, traduzido ou não, que usa o termo polimorfismo para isso.

Renato, quando falamos de OO, uma mensagem tem conteudo fixo e pode ser distinta por ele. Então usando notação java:

a(1) 
a(2)

São mensagens diferentes e se a lista de parâmetros mudar teremos outras mensagens. Para explicar polimorfismo vamos adotar uma simplificação, que o comportamento dos objetos é idepotente e não gera efeitos colaterais.

Polimorfismo é quando a resposta à mensagem muda apesar do remetente acreditar se tratar da mesma mensagem e mesmo destinatario.

Isso significa que:

R manda a(1) para D e recebe b, D neste caso é do tipo X
R manda a(1) para D e recebe c, D neste caso é do tipo Y

Então passar mensagens diferentes, outra lista de parâmetros, não constitui polimorfismo.

Em termos real, polimorfismo só existe quando acontece late-binding ou run-time dispatch.

renatosilva

mister__m:
De onde você tirou isso? :slight_smile: Uma coisa não tem nada a ver com a outra. O nome só identifica a mensagem se quem fizer a linguagem definir assim, oras. Em Java, foi definido que não é assim.

Polimorfismo de OO não tem nada a ver com isso, senão C puro já estaria com meio caminho andado pra ser OO ;-)

Isso, não estou falando do Java.

mister__m:
renato3110:

Acima tem apenas uma mensagem (peide!), mas com formatos diferentes.

Em Java não. :-)

Mas não estou falando de implementações de OO, estou falando de chamar ou não de polimorfismo.

mister__m:
renato3110:

:shock: E como é possível “privatizar” construtores?

Explique o que você quis dizer com isso e o que isso tem a ver com reduzir a visibilidade de um método.

Tá explicado num post aí, você conseguiu ver?

Humm… sei lá, abstrato, subjetivo, conceitual, gnoissológico…

No caso de uma linguagem específica, já existente, isso é bem concreto. :-)

Estou falando de dizer que o modelo de classes está errado. Não tem a ver com a linguagem.

renatosilva

Não acho vaga, apenas a comparação é imprecisa. Tipo eu defino peido e o resto (os argumentos) vêm depois, de várias formas que interessam apenas a quem peidar, não a mim que estou criando os seres vivos e dando-lhes a capacidade de peidar.

cv:
O que vc quer eh algo tipo ECMAScript (erhm, JavaScript), Python ou Ruby entao, onde os parametros que nao forem passados viram null e os que foram passados a mais sao ignorados. O problema com isso eh que nao podem existir dois metodos “peidar”. Voce teria que ter:

def peidar(local=null, horario=null, cheiro=null, cor=null): # libera o gas de mil e uma formas possiveis

Eu só tô vianjando na maionese OO, não estou me referindo a linguagem nenhuma.

:shock: :roll: :? :? :? boiando… :smiley:

renatosilva

louds, bem interessante esse jeito de pensar, mas acho que é uma coisa meio subjetiva, é uma questão de decisão. Na verdade o seu conceito é uma coisa mais precisa a respeito do que é uma mensagem(método).

@+ Cadê o Fábio!!! O que é esse “reintroduce” no Delphi!!!

mister_m

Agora não lembro de cabeça, mas essa discussão já aconteceu pelo menos 5 vezes no SouJava e sempre volta de tempos em tempos e pessoal cita os livros com snippets mesmo, além de um monte de material online. Note que não disse que eram livros bons… :stuck_out_tongue:

mister_m

Bem, então tudo se complica :slight_smile:

Pense bem: o que identifica uma mensagem? Você supõe que é um nome, mas eu posso dizer que cada método é uma mensagem e logo todos os métodos de todas as classes são polimórficos :slight_smile:

Não dá pra discutir isso sem um escopo extremamente definido, não vamos chegar a lugar nenhum assim…

renatosilva

@edit

Quando se fala de OO acho que não se precisa pensar em uma implementação específica. É desse modo que estou pensando. É uma questão de conceito. O que é mensagem? É um método com parâmetros ou os parâmetros são apenas detalhes secundários sobre uma mensagem? Os parâmetros caracterizam as mensagens? Bom o louds acha que sim, eu acho que não. Na verdade depois de ler o último post do louds, acho que às vezes sim (como ele diz), às vezes não(como eu digo), depende do contexto, do conceito.

Como disse: sei lá, abstrato, subjetivo, conceitual, gnoissológico (eu nem sei o que é esse aqui :lol: )…

cv1

Renato, de “eu acho” o inferno ta cheio. Que tal pesquisar? :wink:

http://c2.com/cgi/wiki?MessagePassing

renatosilva

“eu acho” não quer dizer que suponho que eu sou dono da verdade (e você está falando para eu me informar melhor), mas sim a minha opinião, que eu já falei na mensagem anterior. É o meu jeito de ver.

Na verdade eu não tô entendendo qual a sua opinião (você pensa como o louds ou pensa como eu?), nem esses textos do Smalltalk, nem porque o link que você indicou dá acesso negado :smiley:

Mesmo que o power livro dos ultra livros de OO diga que os argumentos discernem as mensagens, acho que vai demorar eu mudar o meu jeito de pensar, que disse no post acima. É uma questão de como você vê as coisas.

Rafael_Steil

Tambem conhecido como “cabeca-dura”.

Rafael

renatosilva

Tá então vamos a um exemplo prático, concreto de que problema especificamente, objetivamente o meu “tudo é peido” way de pensar me causaria. Alguém disposto?

Rafael_Steil

Por mais que alguem perca tempo explicando (de novo) pra vc, nao vai adiantar. Voce esta disposto a todo custo a nao aceitar uma mudanca de conceitos / paradigma.

rafael

cv1

Renato, pq vc nao comeca? :wink:

renatosilva

Rafael Steil:
Por mais que alguem perca tempo explicando (de novo) pra vc, nao vai adiantar. Voce esta disposto a todo custo a nao aceitar uma mudanca de conceitos / paradigma.

rafael

Você está com essa impressão, mas estou bem disposto, até que mudei um pouco a minha visão imediatamente após ler um posts do louds aí… E você não entendeu, eu quero exemplos práticos de problemas, eu já entendi como vocês pensam. A questão é que pensar como vocês ou como eu vai influênciar em quê especificamente? Não vale responder: seu código vai ficar esquisito, manutenção difícil, isso é muito vago.

Porque pra mim não há problemas :wink:

renatosilva

Caras, pensando de ontem pra hoje, estou convencido de que, considerando o conceito inicial, métodos de mesmo nome com parâmetros diferentes não é uma forma de polimorfismo como a Mundo Java me fez acreditar!!! Ahhhh vou rasgar aquela revista :evil:

Na verdade não chamaria nem de polimorfismo paramétrico. Na verdade no meu conceito isso era polimorfismo também. Eu chamaria isso agora de polimorfismo reverso (que tal? :mrgreen: ), por que são várias formas diferentes de se fazer (geralmente) a mesma coisa. Ou sei lá, simplesmente argumentos variáveis (de certa forma) ou o overload do Delphi mesmo :smiley:

O interesante é que, ainda assim, tudo é peido!!!

Até.

mister_m

O nome tecnicamente correto é overloading ou sobrecarga. O termo polimorfismo paramétrico pode ser encontrado em alguns livros e artigos em português, mas eu não recomendo seu uso, pois, como você pode ver, só confunde :slight_smile:

Criado 6 de abril de 2005
Ultima resposta 8 de abr. de 2005
Respostas 45
Participantes 8