Polimorfismo de Herança Vs Polimorfismo Irrestrito

9 respostas
Marcio_Duran

Observando os exemplos abaixo, eu poderia afirmar outras formas de polimorfismos em Java possíveis , que não seja de Herança ou Irrestrito. [size=24]?[/size]

Exemplo Polimorfismo de Herança

public class Poli {int a;
	    Poli(){}
	    void m(){System.out.println("classe Base");}
	}
	class Y extends Poli{int d;
	Y(){}
	void m(){System.out.println("classe Derivada");}
		
	}
class progra{
	static public void main(String args[])
	{Poli g= new Poli();
	Y f=new Y();
	g=f;
	g.m();
	
  }
}

Polimorfismo Irrestrito (Não existe a relação de herança)

interface K {void m();
}
public class A1 implements K{
	int s;
	public void m()
	{System.out.println("Método m da Classe A1");}
	
	void inscr()
	{s=s+1;
	}
}
class A2 implements K{
	int t;
	public void m()
	{System.out.println("método m da classe A2");}
	
	void sub()
	{t=t-1;
	
	}
}
class A3 implements K{
	int d;
	public void m()
	{System.out.println("método m da classse A3");}
	
	void dobra()
	{d=d*2;
	}
}
class inter1 {public static void main(String args[])
{A1 x=new A1();
A2 y =new A2();
A3 z=new A3();
K w=x;
w.m();
w=y;
w.m();
w=z;
w.m();
}
}

9 Respostas

victorwss

Bem, eu pelo menos só consigo imaginar polimorfismo com essas duas formas que você postou.

Marcio_Duran

Incrível porque eu acho que poderia haver algo há mais ai, mas vamos ver se alguém dá um outro parecer nesse questionamento [size=18]; )[/size]

victorwss

Incrível porque eu acho que poderia haver algo há mais ai, mas vamos ver se alguém dá um outro parecer nesse questionamento [size=18]; )[/size]

Dá para fazer alguns truques com reflection que tem efeito semelhante a polimorfismo, mas são casos mais específicos.
Outra coisa que eu consigo imaginar além disso é a famosa POG [size=18]; )[/size], usando um monte de ifs, ou usando um switch.
Mas, nenhum destes casos é polimorfismo de verdade da linguagem. Portanto, vamos ver se aparece mais alguém.

M

O que acha de sobrecarga de métodos? Se considerar polimorfismo como poder se referir a determinado elemento de várias formas, a sobrecarga seria um exemplo, uma vez que podemos chamar o mesmo método (com mesmo nome) a partir de parâmetros diferentes.

Marcio_Duran

Talvez em métodos subscrito ??!!!

B

Ok, uma versão mais genérica da mesma pergunta:

Quantas formas você consegue implementar em Java para que uma variável declarada em um único tipo se comporte de maneiras diferentes dependendo do objeto que é atribuído a ela?

PS: Se essas formas são suportadas a nível de linguagem ou não, não importa, continua sendo polimorfismo.

Marcio_Duran

Bruno Laturner:
Ok, uma versão mais genérica da mesma pergunta:

Quantas formas você consegue implementar em Java para que uma variável declarada em um único tipo se comporte de maneiras diferentes dependendo do objeto que é atribuído a ela?


O Polimorfismo explica muita coisa escondida, e estou querendo me aprofundar nesse conceito, estou vendo exemplos de outras linguagem para buscar melhor entendimento, quanto a Java é mesmo pela implementação mas não quer dizer que se tenha a real regra.


PS: Se essas formas são suportadas a nível de linguagem ou não, não importa, continua sendo polimorfismo.

Sim. Concordo justamente porque o assunto é mais amplo de se discutir.

victorwss

Ok, seguindo essa definição mais genérica, temos isso:
[list]Polimorfismo via herança e sobrescrita de métodos.[/list]
[list]Polimorfismo via implementações distintas de uma mesma interface.[/list]
[list]Design pattern Strategy.[/list]
[list]Design pattern Decorator.[/list]
[list]Invocação de métodos via reflection.[/list]

Se for para considerar gambi-design-patterns, temos também isso:
[list]Comportamentos distintos por meio de um espaguete de ifs.[/list]
[list]Comportamentos distintos por meio de um switch.[/list]
[list]Uso do operador instanceof (que já é por natureza um bad smell).[/list]
[list]Comparar um objeto Class com o que é retornado pelo getClass() do objeto (pior ainda que o instanceof).[/list]

Alguém pode citar mais alguns?

Marcio_Duran

Boa Victorwss,

Agora por Paul R.Reed.JR.

O Polimorfismo proporciona caractéristicas de extensibilidade poderosas para o aplicativo permitindo que futuras classes desconhecidas implementem uma interface previsível e bem concebida sem afetar a maneira como as outras classes tratam com aquela interface. :arrow: Outra pista

[color=blue]Outras questões:
[/color]
ANÁLISE EM PROGRAMAS ORIENTADOS A OBJETOS

:arrow:[color=blue]Fonte da Matéria[/color]

Muitos dos trabalhos encontrados, na área de análise estática de programas orientados a objetos, destinam-se a análise da hierarquia das classes. A necessidade da análise da hierarquia das classes vem do fato das classes em um programa orientado a objetos representarem os novos tipos, definidos pelo programador. Este tipo de análise pode auxiliar no desenvolvimento de softwares orientados a objetos [6].

Outra característica da programação orientada a objetos é o polimorfismo. Existem vários tipos de polimorfismo, por exemplo a redefinição de métodos. Na redefinição de métodos um método redefine o método herdado. O método redefinido possui o mesmo nome, valor de retorno e argumentos do método herdado, ou seja, possui a mesma assinatura [3].

Outro tipo de polimorfismo é a sobrecarga. O polimorfismo tipo sobrecarga permite que existam vários métodos com o mesmo nome, porém com assinaturas levemente diferentes, ou seja, com o número de argumentos diferentes, com os tipos dos argumentos diferentes ou com o valor de retorno diferente [3].

A detecção, estatica, do polimorfismo, ou seja, a análise dos diferentes fluxos de execução de um mesmo método, muitas vezes torna-se inviável pela alta complexidade desta tarefa. Devido a este fato, alguns trabalhos não tratam da análise do polimorfismo. Este é o caso do algoritmo básico proposto por Agesen [1, 2].

Esta dificuldade deve-se ao [color=blue]fato do polimorfismo ser uma característica dinâmica da linguagem[/color]. Quando temos uma hierarquia polimórfica, ou seja, uma descendência de classes onde alguma classe filha redefine a implementação de algum método herdado, isto pode implicar diferentes chamadas de métodos. Esta característica implica diferentes comunicações, o qual é o objeto de análise deste modelo.

Então o tratamento da análise de polimorfismo a nível estático gera muitas informações a serem estudadas, o que muitas vezes torna-se inviável pela complexidade alcanada nesta tarefa. Um dos trabalhos que tenta analisar todas as alternativas geradas pelo polimorfismo é o algoritmo do produto catesiano descrito por Agesen, o qual trata da análise de tipos da linguagem orientada a objetos Self [2].

Criado 19 de fevereiro de 2009
Ultima resposta 20 de fev. de 2009
Respostas 9
Participantes 4