Polimorfismo de Herança Vs Polimorfismo Irrestrito

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

[code]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();

}
}
[/code]

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

[code]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();
}
}
[/code]

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

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]

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

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.

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.

Talvez em métodos subscrito ??!!!

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.

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

[quote]
PS: Se essas formas são suportadas a nível de linguagem ou não, não importa, continua sendo polimorfismo.[/quote]
Sim. Concordo justamente porque o assunto é mais amplo de se discutir.

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?

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].