[MÚSICA] [MÚSICA] Esse é o curso de Orientação a Objetos com Java. Eu sou o Eduardo Guerra e hoje vamos estar falando aqui sobre nÃveis de abstração. A gente aprendeu aà a parte de classes, como funciona ali objeto, abstração. Hoje vamos ver como é que acontece quando essa abstração acontece vários nÃveis diferentes. Então, espero que vocês lembrem aà das outras aulas, o nosso exemplo dos nossos gatinhos, aÃ, o gatinho abstrato, o gatinho concreto. Tem se você pegar aà por exemplo, o Garfield é gato concreto, se eu falar gato, de uma forma geral, eu estou falando da abstração, então a gente apredeu esse nÃvel que é o abstrato e o concreto, dentro de Orientação a Objetos como é que funciona. A questão, é que a gente pode ter vários nÃveis de abstração. Então, se eu estou falando por exemplo, felino, eu estou pensando numa coisa que também é uma abstração, e ela é mais genérico do que o gato, apesar de o gato ser felino ele também não é concreto. Por outro lado se eu pegar aà por exemplo, e falar assim por exemplo, eu tenho gato de rua, não é todo o gato, de repente, o gato de rua ele tem ali comportamento diferenciado, ele tem caracterÃsticas diferenciadas do gato normal, só que eu estou especializando o gato, eu estou pegando aquele conceito, aquela abstração que eu tinha e estou tornando ela mais especÃfica. Então, eu tenho que por exemplo, todo o gato é felino e todo o gato de rua é gato, mas são todos são abstrações, se eu pensar termos de classes, eu teria por exemplo, todos ali poderiam ser classes do meu sistema e até instâncias, só que são classes diferentes nÃveis de abstração. Vou pegar num exemplo aqui mais concreto e olhar pouquinho para o código. Então imagina o seguinte, eu tenho aqui a classe Empregado, tem nome, idade, salário e tenho também a classe Gerente, que além do nome, idade e salário, ele tem também o bónus. Ou seja, ele tem uma caracterÃstica adicional ali. Se eu olhar, essas duas classes aqui estão com o código duplicado, apesar de não ser código, assim de método, de comportamento, eu tenho ali grupo de dados que está duplicado, apesar de por exemplo, na classe Gerente eu ter ali o bónus. Então, vamos tentar pensar, como é que a gente conseguiria, a gente poderia estar criando uma situação ou uma solução que evitaria eu duplicar esse código. Uma solução, que eu acredito que alguns de vocês tenham pensado, é de repente estar colocando tudo isso dentro de uma classe só. Então falou assim, eu vou colocar ali, vou chamar a classe de Emprego e aà o Gerentes que também são empregados eu vou colocar ali, só que eu vou ter a informação de bónus e essa informação para quando eu tiver funcionário comum vai ser 0 e aà quando for gerente ela vai ter valor, seria meio que como se fosse atributo opcional, dependendo se é gerente ou não. E aÃ, agora eu vou falar para vocês porque é que isso dai não é uma boa ideia. Imagine por exemplo, se você tem métodos especÃficos do gerente, por exemplo, método para contratar empregado, ou método para demitir empregado. Não seria legal que todo o empregado tivesse esses métodos, ou que de repente eu tivesse ali tipo e por exemplo, verificasse, então se o bónus não for 0 então eu não vou deixar ele executar aquele método, porque nesse caso ele é gerente. Isso daà não é legal. Você tem métodos numa classe que você não pode usar para todos os objetos. Outro motivo pelo qual isso aà não seria uma boa ideia, por exemplo, a questão se eu tiver outro tipo de empregado, então imagina que eu tenho ali tipo supervisor, então ele fala assim, então vamos colocar ali mais algumas informações opcionais e aà vai lá por exemplo, tem ali o perÃodo de supervisão e tem a sessão de supervisão. Então o que é que acontece? Para todo o supervisor e todo o empregado normal, o bónus seria 0, aà para todo o gerente e para todo o empregado o perÃodo de supervisão e a sessão de supervisão também ficariam vazios, e aà se surgisse mais a gente teria mais uma série de informações que se aplicaria só a tipo e ficaria vazio. Eu, uma experiência minha, que eu tive dessa parte, eu já vi por exemplo, sistemas que utilizavam isso, que tinham 5, 6 tipos, que você de repente tinha ali uma classe, isso aà acontece muito por exemplo, com tabela de banco de dados, e aà por exemplo, talvez umas 20 informações ali, umas 15 são opcionais e aà a grande, a maioria dos objetos que você vai ter daquela classe vão ficar com a maioria das informações vazias. Isso aà não é interessante, porque ás vezes a pessoa está pegando uma classe, "que informações é que eu posso obter daqui?" " não, mas não é sempre que eu consigo", isso daà acaba confundindo bastante. Eu já participei de projetos, já entrei projetos que isso estava acontecendo e realmente acaba confundindo muito todo o mundo. Uma informação que é importate e a gente não parou para pensar tanto, é que o empregado, ele, o gerente ele é empregado, então, por mais que eu possa representar eles separado, ele é como se fosse tipo especial de empregado, assim como o supervisor seria tipo especial de empregado, que pode ter informações a mais, que pode ter métodos a mais, ou talvez o método para o gerente que tem lá no empregado funciona pouco diferente e essa relação de que é 1, ela é extremamente importante. Então, a herança é recurso que a gente tem na Orientação a Objetos, que permite que nós trabalhemos com diferentes nÃveis de abstração dentro de sistema. Então, eu poderia ter por exemplo, o Gerente estendendo a classe Empregado e com isso especializando o comportamento, adicionando informações próprias. Então nessa aula, a gente não vai ver a herança si, ela está logo seguida na aula seguinte, mas antes de pensar herança, a gente tem que entender porque é que ela é necessária. Que é essa a questão de você poder ter vários nÃveis de abstração dentro de sistema, ou seja, determinado momento você quer uma coisa mais geral, e outro momento você quer coisas mais especÃficas. E aà você tem como encadear, por exemplo, eu posso querer terno meu empregado mais genérico e posso querer ter o gerente que pode ter comportamentos mais especÃficos, o supervisor que tem comportamentos mais especÃficos. Espero que com isso, a gente tenha ficado claro, o que é que são esses nÃveis de abstração que a gente pode ter entre as classes e entender como é que isso daà é importante e necessário quando estamos representando domÃnio. Muito obrigado, fique ligado na próxima aula, que aà sim, vamos entrar na parte da herança. [MÚSICA]