LÓGICA DE PROGRAMAÇÃO (JAVA)
Definição Agora que aprendemos os conceitos mais importantes e vimos o uso da Herança em Java, vamos estudar outra características marcante da programação Java e, de uma maneira mais geral, da programação orientada a objetos: o polimorfismo. Com o polimorfismo vamos ter um controle maior sobre as subclasses sem ter que nos preocupar especificamente com cada uma delas, pois cada uma terá autonomia para agir de uma meneira diferente. 2
Definição Traduzindo, do grego, ao pé da letra, polimorfismo significa "muitas formas". Essas formas, em nosso contexto de programação, são as subclasses/objetos criados a partir de uma classe maior, mais geral, ou abstrata. Polimorfismo é a capacidade que o Java nos dá de controlar todas as formas de uma maneira mais simples e geral, sem ter que se preocupar com cada objeto especificamente. Mais uma vez, somente pela definição é muito complicado de entender. 3
Situação 1 de Polimorfismo: Aumento no preço dos carros Vamos pra nossa loja de carros, onde você é o programador Java de lá. Criamos, nesse caso, uma superclasse chamada Carro. E depois criamos várias subclasses, de fuscas, ferraris, gols etc. Imagine que, todo ano, todos na empresa tem um aumento. A Ferrari teve aumento de 5%. o fusca terá aumento de 3% e o gol terá de 1%. 4
Situação 1 de Polimorfismo: Aumento no preço dos carros Vamos pra nossa loja de carros, onde você é o programador Java de lá. Criamos, nesse caso, uma superclasse chamada Carro. E depois criamos várias subclasses, de fuscas, ferraris, gols etc. Imagine que, todo ano, todos na empresa tem um aumento. A Ferrari teve aumento de 5%. o fusca terá aumento de 3% e o gol terá de 1%. 5
Situação 1 de Polimorfismo: Aumento no preço dos carros Note que, embora todos sejam "Carro", cada objeto terá que calcular seu aumento de forma diferente, pois terão diferentes valores de aumento. Como criar, então, um método na superclasse que atenda todas essas necessidades diferentes? Não é na superclasse que se resolve, mas nas subclasses, criando o método 'aumento()' em cada uma. Ou seja, vai criar vários métodos, e para fazer o aumento realmente ocorrer de maneira correta, é só invocar o método do objeto específico. Então: objetoferrari.aumento() é diferente de objetofusca.aumento(). 6
Situação 1 de Polimorfismo: Aumento no preço dos carros Note que usamos o mesmo nome do método para todas as subclasses, porém cada método é diferente um do outro. Isso é o polimorfismo em ação: embora todos os objetos sejam "Carro", eles terão uma forma diferente de agir, pois implementamos os métodos de maneira diferente. Apenas invocamos, e todo objeto sabe exatamente o que fazer. Por isso o nome polimorfismo, pois cada objeto terá sua forma própria de como rodar, pois os métodos 'aumento()' dos objetos são diferentes. 7
Situação 1 de Polimorfismo: Aumento no preço dos carros Outra vantagem do polimorfismo: você já viu que, criando o método aumento() em toda as subclasses, ela agirão de maneira independente da superclasse e diferente de outros objetos. Agora, quando chegar outro carro na sua loja você de adicionar o método aumento(), e terá um novo tipo de objeto, sem grandes alterações no código. 8
Situação 2 de Polimorfismo: animais mugindo, latindo, berrando... Imagine que você é o criador do joguinho Colheita feliz ou Fazenda Feliz (sei lá), onde terá vários bichos nesse jogo. Como você é esperto, vai logo abstrair e criar uma classe "Animal" com as características que todos tem: idade, peso, espécie etc. Porém, nesse game, os animais fazem seu som característico: o cachorro late, o gato mia, o pinto pia, a vaca muge etc. E aí? Como criar um método na superclasse que sirva para todos estes animais? Ora, não cria, pois cada animal age diferente nesse aspecto. 9
Situação 2 de Polimorfismo: animais mugindo, latindo, berrando... Veja, polimorfismo é isso: embora objetos sejam da mesma superclasse, vão agir de maneira diferente em algum aspecto. Ou seja, terão várias(poli) formas diferentes (morfismo). A saída é criar um método chamado 'som()' na superclasse (só o cabeçalho, como veremos nos próximos tutoriais) e em cada subclasse criar um método diferente, que caracterize cada bicho. 10
Situação 2 de Polimorfismo: animais mugindo, latindo, berrando... Veja que se não fizéssemos isso e invocássemos os métodos: vaca.som(), cachorro.som(), gato.som(), todos iriam fazer o mesmo barulho. Com o polimorfismo: vaca.som() faria a vaquinha mugir, cachorro.som() faria o cachorro latir e gato.som() faria o objeto miar. Porém, todos continuam sendo, também, objetos da classe "Animal". 11
Situação 2 de Polimorfismo: animais mugindo, latindo, berrando... E quando chegar mais animais na sua fazenda, adicione o método som() nesse animal, de modo que ele poderá agir conforme suas características. Resumindo: polimorfismo permite que uma mesma superclasse possua subclasses com características - ou formas - diferentes. 12
Exemplos práticos de polimorfismo Por exemplo se você tem uma class Animal sabe que todo animal come, sendo que Cães por exemplo comem ração e Tigres carne. Você pode chamar o método comer nessas 2 classes mesmo sabendo que elas se comportam diferentemente. 13
Exemplos práticos de polimorfismo public class Animal { public void comer() { System.out.println( "Animal Comendo..." ); public class Cao extends Animal { public void comer() { System.out.println( "Cão Comendo..." ); public class Tigre extends Animal { public void comer() { System.out.println( "Tirgre Comendo..." ); 14
Exemplos práticos de polimorfismo No caso a sua chamado de método polimorfico ficaria assim public class Test { public void fazeranimalcomer( Animal animal ) { animal.comer(); public static void main( String[] args ) { Test t = new Test(); t.fazeranimalcomer( new Animal() ); t.fazeranimalcomer( new Cao() ); t.fazeranimalcomer( new Trigre() ); você vai notar que cada chamada vai fazer uma coisa diferente, porem como existe herança entre as classes todos os método vao funcionar, porque são do tipo do mais genérico (Animal) ou são filhos do mais genérico. 15