Polimorfismo

4 respostas
L

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

4 Respostas

DavidUser

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

Lavieri

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 ??

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"
    }
}

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

Veiculo[] veiculos = new Veiculo[3];

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

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)

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);
}

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 ^^

C

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

Lavieri

\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

Criado 9 de maio de 2009
Ultima resposta 9 de mai. de 2009
Respostas 4
Participantes 4