Interface vs. Implementação Herança vs. Composição
O que vimos na última aula? Padrões GRASP Expert Creator Low Coupling High Cohesion 2
O que veremos hoje? Interface e Polimorfismo Interface como uma promessa Tipos e classes Herança de tipo e Herança de implementação Programe para uma interface... Herança versus Composição Por que composição? Quando usar herança? 3
Testando seus conhecimentos!!! Nesta atribuição, quem é o tipo e quem é a classe? Pessoa pessoa1 = new Pessoa(); Quem é a interface e quem é a implementação? 4
Tipo O tipo de um objeto define o conjunto de solicitações às quais ele pode atender O tipo define o que o objeto é capaz de fazer Interface do objeto Promessa de serviços Subtipos, supertipos 5
Objetos são acessados pela sua interface Objetos diferentes, interfaces iguais Ligação dinâmica em tempo de execução Polimorfismo! è Clientes mais simples, objetos mais desacoplados, flexibilidade! Mais fácil mudar cliente Mudar implementação quebra menos o cliente
Classe A classe de um objeto define o estado interno de um objeto e a implementação de suas operações A classe define como o objeto é implementado Implementação do objeto Cumprimento de uma promessa de serviços 7
Relação tipo - classe Forte relacionamento entre tipo e classe Quando uma classe define as suas operações também define o tipo Linguagens como C++ utilizam a mesma estrutura para definir tipo e classe Sem compreender tipo e classe, não há como entender herança de tipo e herança de implementação. 8
Herança de tipo versus Herança de classe Herança de classe (ou de implementação) Define a implementação de um objeto em função da implementação de outro Mecanismo para compartilhamento de código Herança de classe Quero implementar da mesma forma que o outro implementa!!! 9
Herança de tipo (ou de interface) Define quando um objeto pode ser utilizado no lugar do outro......cumprindo a mesma promessa que o outro prometeu. Herança de tipo Quero prometer o mesmo que o outro promete!!! 10
Em Java... Herança de tipo public class NomeDeClasse implements PessoaIF{...} public class NomeDeClasse extends Pessoa{...} Herança de implementação Também implica na herança de tipo 11
Existe alguma diferença, em Java, entre utilizar uma interface e uma classe abstrata onde todos os métodos são também abstratos? 12
Programe para uma interface, e não para uma implementação
Programe para uma interface e não para uma implementação Através da herança de tipo Mesmo utilizando herança de implementação Programe para uma interface (tipo) não para uma classe específica Clientes sem conhecimento do tipo do objeto que estão usando, desde que obedeçam à interface Clientes sem conhecimento da classe que implementa os objetos 14
Flexibilidade!!! A implementação pode ser trocada em tempo de execução Late Binding Em Java, o conceito de interface permite um polimorfismo independente da hierarquia!!! Exemplo: Comparable 15
Programe para uma interface e não para uma implementação Exemplo de projeto pouco flexível... Programando para uma classe!!! Teste Aluno...e se um novo tipo de usuário for adicionado??? Professor, por exemplo 16
Programe para uma interface e não para uma implementação... simples, resolvo com Herança!!! Programando para um tipo usando herança!!! Teste Usuário Aluno Professor... mas... e se o algoritmo de teste de Usuário servir para outras entidades??? Carro, por exemplo 17
... resolvo com interface!!! Agora sim!!! Programando para um tipo usando interface!!! Teste <<interface>> Testavel Aluno Professor Carro...qualquer classe que implemente Testavel poderá ser testada pelo algoritmo de teste! 18
Princípio/Padrão 2: Favoreça composição sobre Herança
Herança versus Composição Mecanismos para reutilizar funcionalidades Composição é geralmente superior à herança Mas por que??? Herança é um acoplamento muito forte!!! Mudar superclasse muda todas as subclasses Uma vez definida em projeto a implementação de um objeto, não se pode mudar em tempo de execução! Subclasse assume estado da superclasse quando o método sobrescrito for chamado 20
Herança versus Composição Eis um problema... Pessoa Tripulante Passageiro Agente Vários papéis podem ser assumidos Várias subclasses? 7 combinações!!! 21
Delegação sempre pode ser usada no lugar de herança Problema??? Mais difícil de entender!!! 22
ou Pessoa <<interface>> Papel Delegação às classes referentes aos papéis Tripulante Passageiro Agente
Outro exemplo: JButton.addActionListener()
Mas então... Quando usar herança? O objeto é um tipo especial de... Transação Dispositivo Reserva Compra Mouse Teclado Pessoa Tripulante Passageiro Agente e não um papel assumido por 25
Mas então... Quando usar herança? O objeto nunca tem que mudar para outra classe Dispositivo Um Tripulante de um vôo pode ser Passageiro de outro. Mouse Teclado Pessoa Um Mouse nunca vai se tornar um Teclado Tripulante Passageiro Agente 26
Mas então... Quando usar herança? As subclasses não sobrescrevem métodos da superclasse (apenas adicionam) Superclasse desenhar() testar() Sobrescreve tudo!? Pra que herdar??? Superclasse desenhar() testar() SubclasseA imprimir() SubclasseB executar() Novas funcionalidades... Compartilha código! SubclasseA desenhar() testar() SubclasseB desenhar() testar() 27
Mas então... Quando usar herança? A superclasse não é uma classe utilitária Vector Principal problema TodoMundo usa ColeçãoA ColeçãoA Não é um vetor... Tem um vetor associado!!! Mas a implementação de ColeçãoA é a de Vector. Se Vector muda, TodoMundo tem que mudar!!! 28
Mas então... Quando usar herança? Se no contexto do problema em questão, papéis representarem tipos!!! Imaginem que existe alguma agência de viagem em que um Tripulante, Passageiro e Agente são fixos! Nesse caso pode ser modelado como um tipo de Pessoa. Pessoa Tripulante Passageiro Agente 29
Mas então... Quando usar herança? De acordo com as leis de utilização da herança... comente a modelagem abaixo!!! FitaVideo calcularpreço( ) Lançamento Normal Infantil calcularpreço( ) calcularpreço( ) calcularpreço( ) Como fazer o projeto usando composição??? 30
O que vimos hoje? Interface e Polimorfismo Interface como uma promessa Tipos e classes Herança de tipo e Herança de implementação Programe para uma interface... Herança versus Composição Por que composição? Quando usar herança? 31
O que veremos na próxima aula? Introdução a padrões de projeto arquitetural Arquitetura de software O que é? Para que serve? Como documentar O que é padrão arquitetural 32
Dúvidas?? 33