[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]