O documento discute o conceito de polimorfismo em programação, dando exemplos de como ele é usado em jogos para permitir que objetos de subclasses diferentes se comportem de maneiras únicas ao implementar métodos de forma distinta, mesmo compartilhando atributos de uma superclasse comum. O documento também explica como o polimorfismo permite que jogos sejam personalizáveis, aceitando novos objetos criados por usuários se esses objetos fornecerem as informações necessárias.
2. OQUE É POLIMORFISMO ?
• 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. POLIMORFISMO EXEMPLOS FÁCEIS E
PRÁTICOS
• Exemplo 1 de Polimorfismo: Aumento no preço dos carros
• Vamos pra nossa loja de carros, onde você é o programador Java de lá.
Lembra que aprendeu, através de exemplos, a criar uma classe bem genérica, 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%.
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().
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.
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.
4. POLIMORFISMO EXEMPLOS FÁCEIS E
PRÁTICOS Todos animais
pertencem a uma
mesma classe
nesse caso, usando
uma imagem com
'UML'
5. ENTENDO O POLIMORFISMO COM
SIMPLES PALAVRAS
• Com o Polimorfismo, os mesmos atributos e
objetos podem ser utilizados em objetos
distintos, porém, com implementações lógicas
diferentes.
6. POLIMORFISMO EM JOGOS
• Vamos pegar um jogo de aventura como exemplo
• Um guerreiro, Um arqueiro e Um mago são classes distintas
mas todos são polimórficas de uma classe central chamada
Personagem[usa arma]
7. MAIS POLIMORFISMO EM JOGOS
• Diferente de antes, hoje em dia os jogos são mais personalizáveis. Antes você somente rodava e usava o que o jogo permitia, e nada mais.
Atualmente, os jogos são feitos com elevados níveis de abstração e funcionam à base de polimorfismo.
Por exemplo, um jogo de carro. O software já vem com alguns carros e pistas feitas para você jogar, porém é comum a prática da criação de
pistas, carros, manobras, cenários.
No jogo Flight Simulator, de aviões, é possível baixar na internet diversos tipos de aeronaves, helicópteros, cidades, aeroportos, pistas de
pouso cor de rosa e até um kombi que voa você pode adicionar.
Aqui a gente se pergunta: como um jogo que foi lançado em uma época, dá suporte e aceita que usemos carros voadores, manobras novas
de carro e outros tipos de customização? Não tem como os programadores do jogo adivinhar o que as pessoas vão criar e adicionar ao seu
aplicativo. Que magia é essa, então?
Ora, o jogo é feito com abstração e polimorfismo. Ao programar esses tipos de games, os desenvolvedores já pensam que as pessoas vão
adicionar novas funcionalidades, então eles focam nisso: programam de modo que o aplicativo possam receber esses novos dados.
Porém, não pode ser qualquer tipo de dado. É necessário uma padronização, que recebem algumas informações, processem e retornem
outros dados para o programa. A entrada e saída - que é a comunicação das novas funcionalidades com o soft - é o mais importante.
8. • Se é uma kombi ou um dinossauro que vai voar, não importa. O jogo Flight Simulator não vai se importar com a figura, pode ser até a foto de seu cachorro. O
importante é que seu 'avião' tenha as informações que o jogo necessita, como peso, tamanho, tipo de turbina, asa etc.
Com base nesses dados é que o game sabe se sua 'aeronave' vai subir, cair, explodir, qual velocidade é a necessária para decolar, dentre outros detalhes
minuciosos.
A grosso modo, é como se o jogo tivesse diversos métodos abstratos como: 'pousar()', 'decolar()', 'pane()' e outros detalhes necessários para um vôo. Ora, como
cada aeronave vai se portar, especificamente, vai depender de quem vai programar as aeronaves (que pode ser qualquer usuário), o importante é que você
forneça informações ao jogo sobre o pouso, decolagem e que condições seu avião entra em pane.
O mesmo acontece com alguns jogos modernos de carros. Podemos montar qualquer um, praticamente do zero.
Para esses adicionais funcionarem, o jogo é feito de modo que, se você criar um carro e informar detalhes importantes como: quantos quilômetros fazem com 1
litro, velocidade máxima, peso, potência do motor etc, seu carro vai funcionar e se adaptar perfeitamente no game. O jogo já vem com essa 'abstração'. Você só
precisa programar o seu carro, especificamente, para fornecer esses dados. Assim, sua criação se encaixará perfeitamente com a aplicação.
Outro claro exemplo são os plugins, como os de navegadores. Você mesmo pode criar uma funcionalidade para seu Firefox ou Chrome, basta saber como eles
'querem' receber as informações, saber que comandos vai alterar que parte do programa exatamente.
Uma linguagem de programação, por exemplo, exige alto nível de abstração para ser criada, afim de suportar o polimorfismo que vamos fazer com ela. Afinal,
uma linguagem de programação como o Java, tem projetos que foram usados até por robôs da NASA em Marte.
Ao criar a linguagem, se criaram certas funções, sintaxes e comandos. A definição destes especifica para que servem, como usar e o que esperar do resultado
de tais funcionalidades.
Sabendo disso, você pode programar o que quiser, do tanto que escreva conforme a sintaxe e use corretamente os comandos. O interpretador de Java saberá
exatamente o que executar, desde que você o oriente de forma correta.
Ou seja, se programar corretamente, o Java suportará várias 'formas' de aplicativo e os executará. Isso que é polimorfismo, não?
Portanto, vimos que a abstração e o polimorfismo são essenciais para se criar aplicações dinâmicas, que permitam o crescimento e a interação com o usuários.
Lembre-se: nenhuma aplicação é ilha. Tudo precisa de interação e expansão.