Sumindo com função do Obj Pai

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.

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

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?

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

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

Rafael

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.

Oi,

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

[quote=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.
[/quote]

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

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

Assim:

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

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

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)…

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

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.

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

Curiosidade, como é isso no Delphi?

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

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)?

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.

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

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…

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.
[/quote]

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…[/quote]

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

renato3110 wrote:

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

[]'s

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!!!