Boa tarde galera, como vocês estão?
Estou atualmente estudando o conceito de Polimorfismo e estou utilizando a linguagem Java como meio de testes.
-> Ouvi dizer por ai, que os tipos de polimorfismo e suas quantidades podem variar de acordo com a linguagem de programação que você utiliza…
Enfim, estudando polimorfismo descobri alguns conceitos legais que a orientação a objetos pode te oferecer e que na maioria das vezes pode sim facilitar (e muito) a sua vida (desde que bem aplicado, é claro).
Polimorfismo é a capacidade que um método tem de possuir diversos comportamentos (implementações) de acordo com o contexto à qual está associado (no caso, a classe que o possui).
Eu acho importante separar alguns conceitos:
1. Assinatura do método: quantidade de parâmetros e seus tipos;
2. Cada classe só pode ter 1 (um) mesmo método (mesmo nome) com a mesma assinatura.
Nesse caso, é comum vermos alguns “tipos” de polimorfismo. São eles:
1. POLIMORFISMO DE SOBREPOSIÇÃO: uma super-classe possui um método abstrato/não-abstrato que pode ser sobreposto/sobrescrito por uma sub-classe/classe herdeira desta. Isso permite que um mesmo método tenha diferentes comportamentos de acordo com o seu contexto e classe que o possui. (Isso também se aplica à Interfaces e a classes abstratas???)
2. POLIMORFISMO DE SOBRECARGA: uma mesma classe pode ter um mesmo método (mesmo nome) com diferentes assinaturas. Esse conceito é chamado de sobrecarga de métodos. A quantidade e os tipos de parâmetros de cada assinatura do método sobrecarregado ditarão o comportamento/implementação que o mesmo deverá ter/realizar.
3. POLIMORFISMO PARAMÉTRICO: permite escrever métodos que recebam como parâmetros (ou retornem) objetos que possuem uma mesma super-classe (tanto direta, quanto indiretamente). -> funciona como um contrato. Assim, eu recebo qualquer classe que implemente a classe X tendo a segurança de que todas as sub-classes da classe X possuirão o(s) método(s) que interessa para o método primeiro. Em síntese, eu só preciso me preocupar com os métodos que preciso da super-classe e só receberei como parâmetros objetos que possuem determinados métodos.
Ao meu ver:
-> Polimorfismo de sobreposição: método abstrato/não-abstrato com apenas 1 assinatura na super-classe. Uma nova implementação deve ser realizada em sub-classes. Cada sub-classe só deve implementar este método 1 (uma) vez.
-> Polimorfismo de sobrecarga: método abstrato/não-abstrato que possui várias assinaturas em uma mesma classe.
-> Acredito que pode sim haver o polimorfismo de sobreposição, o de sobrecarga e o paramétrico ao mesmo tempo.
O que vocês acham? Acrescentariam mais algum conhecimento ou curiosidade? Acham que falei muita abobrinha? Esse é o momento de conversarmos sobre polimorfismo!
Encontrei uma discussão interessante do usuário dudu795 aqui no fórum do GUJ: Discussão sobre polimorfismo
E não esqueçam, fiquem em casa!