Polimorfismo

[b][i][color=darkblue] [/color][size=18] [/size]Bom estou precisando de algum material que possa explicar com exemplos este assunto ainda que eu não consegui apreender>>>polimorfismo>>.>>.

busque apostilas da caelum ou do própio tutorials sun.

explicação rapida…

Polimorfismo é o que faz vc em java definir que um objeto pode ter muitas formas, e o que diabos é isso ??

Imaginemos o eguinte cenário … Veículo, quando vc pense em veículo, pode pensar em varios tipos de veículo, por exemplo, Moto, Carro, Helicoptero … todos são veículos de locomoção … o que eles tem em comum ? digamos que todos eles possam se locomover de um ponto A para um ponto B … e que todos ele são Objetos Aceleraveis (ou seja suas velocidades podem ser aumentadas e diminuidas) …

Então como seria Um Objeto Veículo em nosso modelo ??

[code]public class Veiculo implements Aceleravel {

private Ponto atual;
private int velocidade = 10; //velocidade incial

public Veiculo(Ponto inicial) { this.atual = inicial; }

public Date calculaTempoPara(Ponto b) {
     //calcula q horas vai chegar no ponto b, e retorna a data
}

public void acelerar(int valor) {
     velocidade += valor; //aumenta ou diminui a velocidade, de acordo com o sinal de "valor"
}

}[/code]

Agora explicando o que seria implements Aceleravel, é uma interface, que diz que este objeto, é um tipo de objeto capaz de acelerar, varios objetos tem esse comportamento, e ele não precisa necesariamente ser um veiculo para poder acelerar, liquidificadores podem, cortadores de grama, carros, motos, barcos, pessoas e etc… Aceleravel é uma das formas de polimorfismo e que dizer um comportamento que é dado por uma interface…

public interface Aceleravel { public void acelerar(int valor); }

ou seja, qualquer objeto pode se declarar Aceleravél! para tal ele precisa implementar a interface e assim escrever o método acelerar(int valor) e nele definir como o objeto em questão acelera…

no nosso exemplo todos os nossos veiculos tem essa capacidade, de acelerar, e protanto o objeto veiculo implementa essa caracteristica…

Agora nos temos varios outros veiculos, que não vamos nos aprofundar neles, esse veiculos são carros, motos e helicoptros

public class Moto extends Veiculo { //... propriedade e métodos apenas de Moto public void impinar() { ... } }

public class Helicoptoro extends Veiculo { //... propriedades e métodos apenas de Helicoptoro public void lenvatarVoo() {...} }

public class Carro extends Veiculo { //... propriedades e métodos apenas de Carro public void cavaloDePau() {...} }

Nossos 3 veiculos estão definidos, e tem propriedades proprias… o polimorfismo para java é dizer que o Carro não é apenas um Objeto carro, ele é tb um Objeto Veiculo (o que recebe via herança) assim como tem tb um comportamento de um objeto Acelerável … sendo assim eu posso fazer

Carro meuCarro = new Carro(pontoInicial);
Veiculo meuVeiculo = new Carro(pontoInicial);
Aceleravel meuAceleravel = new Carro(pontoInicial);
Object meuObjeto = new Carro(pontoIncial);

o Carro aceita todas essas formas defindas acima, por conta do seu polimorfismo definido pela suas heranças e implementações…

o fato é quando eu subo na cadeia eu não consigo enxergar os métodos especializados do carro, por exemplo

meuVeiculo.calculaTempoPara(pontoFInal); //isso é possivel meuVeiculo.cavaloDePau(); //isso não é possivel ...

mesmo sendo o meuVeiculo um carro, eu não posso dar um cavalo de pau em qualquer veiculo, so posso dar um cavalo de pau em um carro, sendo assim, quando vc olha para a forma de Veiculo, vc não encherga as formas abaixo na cadeia de herança, mesmo que o objeto dentro da variável seja um carro… ate pq ele podia não ser

meuVeiculo = new Helicoptoro(pontoInicial); //pronto o meuVeiculo passou a ser um helicoptoro...

usando novamente o polimorfismo, digamos que que tenha uma lista dos meus veiculos no ponto inicial…

[code]Veiculo[] veiculos = new Veiculo[3];

veiculos[0] = new Carro(pontoInicial);
veiculos[1] = new Helicoptoro(pontoInicial);
veiculos[2] = new Moto(pontoInicial);[/code]

já que todos são veiculo eu posso calcular o tempo de cada um ate um ponto final

for (int i = 0; i < veiculos.length; i++) { System.out.println(veliculos[i].calculaTempoPara(pontoFinal)); }

ja que todos acima estão na forma de veículo…

posso ter uma lista de objetos capazes de acelrar, e poso querer acelarar todos meus objetos da minha lista em 10 … (suponha que Liquidificador tb implemente Aceleravel)

[code] Aceleravel[] aceleraveis = new Aceleravel[4];

aceleraveis[0] = new Carro(pontoInicial);
aceleraveis[1] = new Helicoptoro(pontoInicial);
aceleraveis[2] = new Moto(pontoInicial);
aceleraveis[3] = new Liquidificador();

for (int i = 0; i < aceleraveis.length ; i++) {
aceleraveis[i].acelerar(10);
}[/code]

mesmo sendo um Liquidificador algo totalmente diferente de um Carro, como todos estes objetos podem assumir a forma de um objeto Aceleravel, eu sou capaz de guarda-los em uma lista de aceleraveis e usar os métodos da interface de Aceleravel

Espero ter ajudado ^^

Ô caba arretado! Deu uma aula de polimorfismo :slight_smile:

\o/ a intenção é ajudar ^^

hihihi cabei de ler denovo… ta xeio de erro de portugues o.O …

mas valeu o comentário

o pior é que comecei o post com uma mentira ahuauha

acabou se extendendo muito a resposta