Orientação a Objetos — Polimorfismo Conceito, exemplos práticos e exercı́cio
▶ Entender o que é polimorfismo em OO
▶ Diferenciar polimorfismo em tempo de compilação e execução
▶ Demonstrar binding dinâmico com exemplos (Java e Python)
▶ Aplicar polimorfismo para resolver exercı́cio rápido
em OO ▶ Diferenciar polimorfismo em tempo de compila¸ c˜ ao e execu¸ c˜ ao ▶ Demonstrar binding dinˆ amico com exemplos (Java e Python) ▶ Aplicar polimorfismo para resolver exerc´ ıcio r´ apido
Encapsulamento, Heran¸ ca, Abstra¸ c˜ ao, Polimorfismo ▶ Papel do polimorfismo: tratar objetos de tipos diferentes por um mesmo contrato; reduzir acoplamento; aumentar extensi- bilidade ▶ Polimorfismo reduz o acoplamento entre as classes; previne que novos c´ odigos resultem em modifica¸ c˜ oes em diversos lugares.
objetos de diferentes classes re- sponderem ` a mesma chamada de m´ etodo de forma espec´ ıfica ao seu tipo concreto ▶ Benef´ ıcios: flexibilidade, extensibilidade, reuso e facilita a leitura do c´ odigo.
nome, assinat- uras diferentes) — resolvido em compila¸ c˜ ao ▶ Dinˆ amico / runtime: overriding (subclasse substitui imple- menta¸ c˜ ao da superclasse) Foco da aula: polimorfismo dinˆ amico (overriding) e uso com interfaces/abstra¸ c˜ oes)
▶ Outra ramifica¸ c˜ ao: Animal ← P´ assaro ← Andorinha ▶ Vari´ avel do tipo Animal pode referenciar Cachorro ou Andorinha; animal.comunicar() usa a implementa¸ c˜ ao do objeto concreto
Implementar hierarquia Vehicle com subtipos Car, Bike, Truck ▶ Cada classe implementa mover() com comportamento difer- ente: ▶ Car: ”dirigindo” ▶ Bike: ”pedalando” ▶ Truck: ”transportando carga” ▶ Escrever uma fun¸ c˜ ao que recebe uma lista de Vehicle e in- voque mover() em cada elemento Crit´ erios r´ apidos de corre¸ c˜ ao: compila/executa e imprime com- portamentos diferentes; uso de abstra¸ c˜ ao; c´ odigo limpo
public class TestVehicles { public static void moverTodos(java.util.List<Vehicle> vs) { for (Vehicle v : vs) v.mover(); } public static void main(String[] args) { java.util.List<Vehicle> lista = new java.util.ArrayList<>(); lista.add(new Car()); lista.add(new Bike()); lista.add(new Truck()); moverTodos(lista); } }
execu¸ c˜ ao class Vehicle: def mover(self): raise NotImplementedError class Car(Vehicle): def mover(self): print("Car: dirigindo") class Bike(Vehicle): def mover(self): print("Bike: pedalando") class Truck(Vehicle): def mover(self): print("Truck: transportando carga") def mover_todos(lista): for v in lista: v.mover() if __name__ == "__main__": lista = [Car(), Bike(), Truck()] mover_todos(lista)