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?
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?
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.
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=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.
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
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.
[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 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.
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? 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
Polimorfismo paramétrico, com certeza
Em Java não.
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.
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!!!