Dúvida: Polimorfismo

12 respostas
G

Pessoal, estou com uma dúvida á respeito de Polimorfismo.

Quando crio uma relação de herança entre classes e declaro um objeto polimórfico, só consigo acessar os métodos que estejam presentes na superclasse ou no máximo que estejam nas duas classes.

Porém sempre soube que a superclasse deveria possuir um nível de abstração para que seja adaptável á subclasse, e por sua vez a subclasse implementaria de acordo com a necessidade, podendo além de sobrepor métodos da superclasse, também criar novos métodos comuns ao caso.

Porém de nada adiantaria criar novos métodos na subclasse se na relação de Polimorfísmo não tenho como acessar esses métodos, pelo motivo de eles não estarem presentes na superclasse, por ser característica exclusiva do caso da subclasse implementar.

Não sei se consegui ser claro, mas estou com mtas dúvidas á esse respeito.

12 Respostas

danieldestro

Por isso as subclasses são chamadas de especializações das superclasses (mais genéricas).

G

Tá, mas a questão é, pra que ter métodos mais genéricos na subclasse se não consigo acessá-los atravéz de um objeto polimórfico ?

danieldestro

Mais genéricos ou mais específicos?

G

Isso, específicos!

danieldestro

Se você está estendendo uma classe, quer dizer que quer torná-la mais específica, ou seja, mudar o comportamento de alguna métodos já existentes (polimorfismo) e/ou adicionar funcionalidades novas.

Exemplo:

public class Carro { public void abastecer( Gasolina g ) { ... } }

public class CarroTotalFlex { public void abastecer( Alcool a ) { ... } }

O Total Flex, além de Gasolina, também suporta Álcool. Sacou?

G

Sim sim, eu quero dizer assim :

Funcionario f = new FuncionarioCLT();

Atravéz do objeto f só consigo acessar os métodos que estejam em Funcionario, os implementados em FuncionarioCLT somente ñ consigo.

Porque ? Tem como burlar isso?

Obrigado,
Gustavo

danieldestro

Tem, usando reflection. (tem um tutorial aqui no GUJ).

Mesmo assim, se os métodos são mais ESPECÍFICOS, não faz mesmo muito sentido usar em algo mais GENÉRICO.

G

gustavo_marcon:
Sim sim, eu quero dizer assim :

Funcionario f = new FuncionarioCLT();

Atravéz do objeto f só consigo acessar os métodos que estejam em Funcionario, os implementados em FuncionarioCLT somente ñ consigo.

Porque ? Tem como burlar isso?

Obrigado,
Gustavo

Se vc quer ter acesso à especialidades da classe FuncionarioCLT vc tem que instancia-la em um objeto do tipo FuncionarioCLT. Nada mais óbvio que isso, pq eu chamaria o pai pra fazer uma coisa que só o filho sabe fazer?

Porque vc iria chamar meu pai pra construir um software pra ti se ele é um segurança e não um programador?

jfnando

acho q vc poderia fazer assim

Funcionar f = new FuncionarioCLT();

( (FuncionarioCLT) f ).metodoDaDubclasse.

Veja se funciona!!! :slight_smile:

cv1

vc quis dizer ‘casts’, ne? :wink:

danieldestro

Disse reflection mesmo. Assumi que cast era algo que ele já conhecia.

sudeval

jfnando:
acho q vc poderia fazer assim

Funcionar f = new FuncionarioCLT();

( (FuncionarioCLT) f ).metodoDaDubclasse.

Veja se funciona!!! :)

isso!

Criado 14 de junho de 2006
Ultima resposta 15 de jun. de 2006
Respostas 12
Participantes 6