[MÚSICA] [MÚSICA] Olá a todos! Esse é o curso Desenvolvimento Ágil com Padrões de Projeto, meu nome é Eduardo Guerra. Essa é a última aula do módulo que a gente tá fazendo uma revisão sobre a orientação objeto pra gente poder ir fundo aí nos padrões, tá. Agora a gente vai falar do polimorfismo, o nosso fogo, nosso elemento fogo, nosso elemento transformador, certo? Então, a gente vai entender aí como funciona o polimorfismo que é conceito que às vezes muita gente usa e não entende exatamente como que aquilo ali está funcionando, então a gente vai entender o que é esse polimorfismo. Vou começar falando pouco sobre a palavra, né? Então poli significa muitos, morfismo formas, polimorfismo é muitas formas tá, que sentido? No sentido que você pode enxergar objeto a partir de qualquer uma das suas abstrações Então, por exemplo, imagina que eu tenha esse carro aqui, né, esse objeto que seria objeto concreto, eu posso ter, eu posso enxergar ele como uma SUV, eu posso enxergar ele como carro, ou posso enxergar ele como transporte terrestre. Significa que se eu tenho método por exemplo que aceita carro, eu posso tá passando esse objeto que é da classe SUV, por quê? Porque carro é uma das abstrações. Significa que ele tá assumindo a forma de carro para poder ser utilizado por aquele método, tá. Então polimorfismo é o objeto poder assumir a forma de qualquer uma das suas abstrações. Eu não tô assim, a pessoa fala múltiplas formas como se o objeto fosse sei lá mudar tempo de execução, não, ele já tem aquelas abstrações. É como se da mesma forma que, por exemplo, sei lá eu, eu sou pesquisador, sou professor, sou pai, sou amigo, sou marido, e aí dependendo da situação eu vou, digamos assim, assumir aquela forma, assumir aquele papel. Então de certa forma, acaba que o objeto é o mesmo e ele têm aquelas várias abstrações, pode tá dentro da mesma hierarquia, pode ser a interface que ele tenha e se você tem método que aceita uma dessas abstrações ou uma variável, você sempre pode tá enxergando aquele objeto como qualquer uma de suas abstrações. E aí quem tá utilizando não precisa saber qual é o objeto concreto que tá ali porque ele tá numa forma que aquele método conhece, tá. Então, vamos ver aqui como exemplo, a gente na aula de herança, a gente falou por exemplo da classe Conection, né? Então eu tenho aí por exemplo esse método Ping que vai retornar true ou false onde eu vou pegar ali uma conexão, vou tentar mandar a informação e se eu conseguir mandar com sucesso, eu dou return true, se der uma exceção, eu dou return false e depois fecho essa conexão, tá. Note que eu posso por exemplo utilizar esse método tanto com uma conexão de banco de dados quanto com uma conexão de rede, quanto com qualquer outro tipo de conexão que tiver essa abstração Conection. Independente com que que tá conectando como é qualquer uma dessas conexões quando for passada para esse método, vai assumir essa Conection e vai conseguir ser utilizada por ele, tá. Pegando aqui exemplo diferente ali da nossa interface Expirable, imagina que eu tenha ali método chamado doTimeout que vai chamar o executeTimeout nos objetos que o tempo ali expirou. Então, eu tô passando ali com o parâmetro pro método o tempo e uma lista de Expirable e aí ele vai interagir aí naquela lista, verificando se o Timeout ali tá maior que o tempo, ou seja, se aquilo ali foi atingido, e caso tenha acontecido, ele vai chamar o executeTimeout. Note que eu posso por exemplo ter conjunto de conexões que implementa ali a interface Expirable. E essas conexões eu verificar se elas já expiraram e chamar ali a lógica de Timeout, quanto eu posso ter por exemplo vários leilões, né? Verificar se cada deles já acabou e caso tenha terminado, também, vou chamar o executeTimeout que vai finalizar ali o leilão por exemplo. Então com isso daí a gente consegue ver que a gente pode usar esse método também pra qualquer classe que tenha essa abstração. E tanto o leilão quanto a conexão vão assumir essa tal forma do Expirable pra poder ser passado pra esse método. Inclusive essa lista que eu tô passando pro método, esse array na verdade que eu tô passando de Expirable, não precisa ter objetos todos da mesma classe. Ele pode ter, sei lá, leilão, uma conexão e qualquer outra coisa que implementa o Expirable, certo? Então, a principal ideia do reuso na orientação objetos é que com o uso do polimorfismo permite que uma nova classe seja utilizada por método já existente. Então, eu tô querendo criar uma conexão com alguma coisa, eu posso usar abstração Conection pra criar minha conexão e a partir daí eu vou ter disponível pra mim aquele método Ping. Da mesma forma, se eu tiver alguma outra coisa que expira, por exemplo, sei lá, desconto, ou uma promoção, cupom por exemplo. Eu posso fazer ele implementando essa interface Expirable e posso reutilizar aquele método Timeout. Então, olha que legal! Eu tô criando método que já existe, mas eu consigo pegar uma classe minha que tem pedaço de código meu e passar pra esse método, mesmo sem esse método tendo sido criado antes e não conhecer aquela classe, eu consigo utilizar aquele método com aquela classe nova. Isso realmente é uma das questões que gera bastante esse reuso, essa vantagem aí de design orientado objeto bem utilizado, a gente vai ver que os padrões aí vão utilizar bastante o polimorfismo. Então com essa aula a gente encerra o nosso módulo introdutório de orientação a objetos. Espero que esses conceitos estejam frescos na cabeça de vocês pra que a gente possa entrar com tudo com os padrões. Muito obrigado! E até mais! [MÚSICA] [MÚSICA] [ÁUDIO_EM_BRANCO]