Objetivos. Explorar os conceitos fundamentais acerca do uso herança na linguagem Java

Documentos relacionados
Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

Programação Orientada a Objetos JAVA - NETBEANS

Herança. Herança. Herança. Herança. Herança. Programação Orientada a Objetos

Engenharia de Software. Aula 10 Representação dos Conceitos de Orientação a Objetos. Prof. Me. Rogério Ferreira

Linguagens de Programação Aula 12

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Programação Orientada a Objetos 2 Flávio de Oliveira Silva, M.Sc.

Classe Abstrata e Interface

Linguagem de Programação III

Programação por Objectos. Java

Programação Java (nível intermediário) 4. Polimorfismo

Laboratório de programação II

POO29004 Programação Orientada a Objetos

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Introdução ao Java. Prof. Herbert Rausch Fernandes

O PARADIGMA ORIENTADO POR OBJETOS

4 Conceito de Herança

Polimorfismo. O que é polimorfismo?

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos 2 Prof. Fabiano Dorça. Padrões de Projeto.

Programação Orientada a Objetos Flávio de Oliveira Silva 144

POO29004 Programação Orientada a Objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Java 2 Standard Edition Classes internas

Programação Orientada a Objetos

C com introdução a OO

Interface vs. Implementação Herança vs. Composição

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Programação Orientada a Objetos

6 Polimorfismo. Desenvolvimento OO com Java. Vítor E. Silva Souza ~ vitorsouza

Java para Desktop. Programação Orientada à Objetos 2 JSE

LEIC-T LERC MEIC-T 2011/2012 1º Semestre Programação com Objetos 2012/01/07 11h00m 3/10

Desenvolvimento Web TCC Turma A-1

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Computação II Orientação a Objetos

Programação Orientada a Objetos

Linguagem de Programação IV Introdução

Orientação a Objetos (OO) LPG II - Java. Orientação a Objetos (OO) Programação Orientada a Objetos. Programação Procedimental

Unidade 3: Classes em Java Para Programadores C Classes, Objetos e Tratamento de Erros Prof. Daniel Caetano

A B Classe Genérica D A C. Classe Especializada. Classe Especializada. Características Herdadas

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação OO em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Modelo do Mundo Real. Abstração. Interpretação

Linguagem de Programação. Diagrama de classes

Introdução à Orientação a Objetos

Linguagem de Programação III

Programação Orienta a Objetos

Linguagem de Programação II Herança

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Laboratório de Programação. Aula 2 Java 5COP088. Aula 2 Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Vejamos o seguinte exemplo public class Exemplo private int testada = 20; public void testapalavra(int testada) JOptionPane.showMessageDialog(null,"Pa

Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces

Programação Java. - Herança e Polimorfismo - Marco Fagundes Marco Fagundes -

9 Classes Abstractas e Interfaces

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

Abstract Factory. Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas

Unidade: sobrecarga, construtores e herança

Sobrecarga, Sobreposição e Polimorfismo

Programação Orientada a Objetos. SANTOS, Rafael (PLT) e Guia de Estudo SCJP. SIERRA, Kathy e BATES, Bert

Herança Sendo uma linguagem orientada a objetos Java oferece mecanismos para definir classes derivadas a partir de classes existentes; As classes deri

Java First-Tier: Aplicações. Herança: Simples Múltipla. Orientação a Objetos em Java (III) Problemas de Herança Múltipla.

COMPORTAMENTOS - Observações

Laboratório de programação II

Java First-Tier: Aplicações. Sobrecarga. Orientação a Objetos em Java (II) Sobrecarga de Construtores: Exemplo de Declaração

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

1 Introdução e Conceitos básicos

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Computação II Orientação a Objetos

Polimorfismo. PARTE II: Java e OO. Polimorfismo. Polimorfismo. Polimorfismo. Polimorfismo

Módulo III Padrões GOF

Linguagem de programação Programação Orientada a objetos

UNIDADE 5 Aplicação dos Conceitos de Orientação a Objetos

Reutilização de Classes Cap. 8 Introdução à Programação OO Rafael Santos

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -


Aula 9 POO 1 Polimorfismo. Profa. Elaine Faria UFU

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Herança e Polimorfismo

Programação Orientada a Objetos SANTOS, Rafael

Interfaces e polimorfismo

TÉCNICAS DE ORIENTAÇÃO A OBJETOS

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

UNIVERSIDADE FEDERAL DE SANTA MARIA CENTRO DE TECNOLOGIA AULA 15 PROFª BRUNO CALEGARO

Capítulo 2. Orientação a Objetos

Orientação a Objetos (OO)

Programação com Objectos 2º Teste Tipo 1º Semestre (120 minutos)

Introdução a Programação Orientada a Aspectos

Orientação a Objetos (OO) Java Avançado Revisão do Paradigma de. Orientação a Objetos (OO) Programação Orientada a Objetos. Programação Procedimental

Programação Orientada a Objetos

Python Orientação a Objetos. Introdução à Programação SI2

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Interfaces POO. Prof. Marcio Delamaro

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Aula 9 Herança. Prof. Jefersson Alex dos Santos

Polimorfismo: aprendendo a prever o futuro. Polimorfismo: aprendendo a prever o futuro. Definições (2/5) Definições Tipos de Polimorfismo

Transcrição:

Objetivos Explorar os conceitos fundamentais acerca do uso herança na linguagem Java Como a herança reutiliza código, vantagens e desvantagens, o problema weak base-class, acoplamento com herança, o uso de herança e extensão em alguns cenários e boas práticas Discutir o uso de herança com outros mecanismos de reuso de código, como a composição Por que usar composição? Quais são os benefícios? regras de design, delegação (ou forward), acoplamento de código com composição, boas práticas e exemplos de códigos em Java 2

Reuso de código Quando você precisa de uma classe em Java, você pode escolher entre: ❶ Usar uma classe que já faz exatamente o que você deseja fazer (API, Internet, colega,...) ❷ Escrever uma classe do zero ❸ Reutilizar uma classe existente ou estrutura (hierarquia) de classes com herança ❹ Reutilizar uma classe existente com composição 3

Herança Parte I : reuso com herança 4

Herança Permite reutilizar as características de uma classe na definição de outra classe Reutilização direta de código previamente definido por alguém em uma superclasse Terminologias relacionadas à Herança: Classes mais generalizadas: superclasses Mais especializadas: subclasses Na herança, classes estão ligadas à uma hierarquia É a contribuição original do paradigma OO Linguagens como Java, C++, Object Pascal, 5

Herança Propriedades, conexões a objetos e métodos comuns ficam na superclasse (classe de generalização) Adicionamos mais dessas coisas nas subclasses (classes de especialização) A herança viabiliza a construção de sistemas a partir de componentes facilmente reutilizáveis Suporte a reutilização até entre sistemas Facilita a extensibilidade em um mesmo sistema A classe descendente não tem trabalho para receber a herança Basta usar o extends e redefinir os métodos necessários (comportamentos mais especializados) 6

Herança pura e extensão Pode-se reutilizar código com herança pura (note, no caso ao lado, que todos os métodos genéricos foram sobrepostos) Na extensão, novos comportamentos foram adicionados nas classes de especialização (os métodos genéricos são herdados) 7

Árvore de Herança 8

Árvore de Herança União das classes que herdam entre si gera uma árvore de herança (ou uma hierarquia de classes relacionadas) Todos os objetos herdam características (gerais) definidas em Forma Círculo, Quadrado e Triângulo são especializações de Forma (é uma Forma) Em todos os casos, cada subclasse possui uma única superclasse A isso, chamamos de herança simples Em algumas linguagens, é possível herdar a partir de diversas superclasses 9

Herança Herança é uma técnica para prover suporte a especialização Uma classe mais abaixo na hierarquia deve especializar comportamentos (tipo mais especializado de...) Métodos e variáveis internas são herdados por todos os objetos dos níveis mais abaixo Várias subclasses podem herdar as características de uma única superclasse Lembre-se: Java não possui herança múltipla! Mas C++ sim! 10

Herança Se B é uma subclasse de A, então: Os objetos de B suportam todas as operações suportadas pelos objetos de A, exceto aquelas que foram redefinidas O objetos de B incluem todas as variáveis de instância de B + todas as variáveis de instância de A Lembre-se que métodos declarados como private não serão herdados, visto que o escopo é a classe que declarou este método em particular Construtores também não são herdados Serão chamados (em cascata) na construção de objetos especializados (inicializar a parte que vem de cima ) 11

Benefícios da Herança Como código pode ser facilmente reutilizado, a quantidade de código a ser adicionado numa (sub)classe pode diminuir bastante Subclasses provêem comportamentos especializados tomando como base os elementos comuns A reutilização pode ser realizada mais de uma vez por outras (e até novas) subclasses Potencializa a manutenção de sistemas Maior legibilidade do código existente Quantidade menor de código a ser acrescentado 12

Benefícios da Herança Quando relacionamos duas classes via herança, podemos ter polimorfismo com ligação dinâmica Se um fragmento de código usa uma referência de uma superclasse (Forma), esta pode manipular novos tipos concretos futuros (Retângulo, e.g.) Isso porque ligação dinâmica irá garantir que os métodos certos de Retângulo (desenhar(), apagar(),... sejam chamados adequadamente Hierarquia de Classes Tipo novo Retangulo desenha() apaga() ligação dinâmica Código Java... void abrir(forma f){ f.desenha();... abrir(new Retangulo()); 13

Cenário de uso(1) Imagine a modelagem de um sistema para um jogo de luta infantil para computador (com personagens) Personagem desenhar(); falar(); arma(); Classe abstrata que possui a interface comum a todos os personagens public abstract class Personagem { public abstract void desenhar(); public void falar(){ /* código comum para falar */ Soldado General public void arma(){ desenhar(); desenhar(); /* código comum para atirar */ public class Soldado Subclasses redefinem comportamentos específicos extends Personagem{ public class General public void desenhar(){ extends Personagem { /* desenha o soldado */; public void desenhar(){ Implementações de falar e arma /* desenha o general */; serão usadas da superclasse Implementações de falar e arma 14 serão usadas da superclasse

Um novo personagem: Personagem desenhar(); falar(); arma(); Cenário de uso(1) public class LutadorSumo extends Personagem { public void desenhar(){ /* desenha o lutador */; public void arma(){ /* deixa corpo em branco? */ Temos comportamentos que não são comuns a todos os objetos! Soldado desenhar(); General desenhar(); Implementação de falar pode ser herdada da superclasse Personagem. Desenhar pode ser redefinido, mas... Tentativa: LutadorSumo desenhar(); arma(); o lutador de SUMÔ não deve atirar! E se tirarmos o método arma da superclasse Personagem e colocá-lo em cada uma das subclasses? (duplicação!) 15

Problemas com a Herança Alguns autores afirmam que a Herança fere o princípio do encapsulamento Mudanças na superclasse podem ser difíceis Subclasses recebem/enxergam os dados e a implementação da superclasse Mesmo assim, hoje, muitos programadores consideram ainda a herança como a ferramenta básica de extensão e reuso de código Outro grande problema é a mudança a de comportamento dinamicamente (em tempo de execução) Veja no próximo slide 16

Cenário de uso(2) Imagine a mesma modelagem com General e Soldado usando armas de fogo (nada novo) Soldado desenhar(); Personagem desenhar(); falar(); arma(); General desenhar(); public class Soldado extends Personagem{ public void desenhar(){ /* desenha o soldado */; public void arma(){ System.out.print( Tiro ) public class General extends Personagem{ public void desenhar(){ /* desenha o general */; public void arma(){ System.out.print( Rajada ) arma(); arma(); public class General As subclasses podem redefinir métodos para um comportamento específico 17

Cenário de uso(2) Problema: trocar a arma do soldado por uma outra qualquer (inclusive futuras) dinamicamente public class UsaPersonagem { A arma (revólver) está parafusada no public static void main(string[] args){ código da classe Soldado Personagem p; public class Soldado p = new Soldado(); extends p.desenha(): Personagem{ p.arma(); // imprime Tiro public void desenhar(){ /* desenha o soldado */; public void arma(){ public public void void arma(int arma(int arma){ arma){ System.out.print( Tiro ) if(arma if(arma == == 0){ 0){ // // imprime imprime Tiro Tiro else else { // // imprime imprime Rajada Rajada O que acontece quando novas armas surgirem no jogo em cada uma das classes de personagens? Tentativa: E se colocarmos um IF dentro do método arma na classe Soldado para decidir qual arma ele deve usar dentre as possíveis armas do jogo? 18

Problemas com a Herança Não estamos tendo sucesso nestes cenários (1 e 2) do Jogo com herança. Por que? No primeiro cenário, existem comportamentos na superclasse que não são comuns a todos os personagens do jogo. No segundo cenário, o código da arma específica está parafusado em cada uma das classes. Isso não apenas dificulta a criação de novas armas para o jogo, mas também não permite que um personagem mude de arma em tempo de execução. O que fazer? 19

Composição Parte 2 : reuso com composição 20

Como aumentar as chances de reuso? Separar as partes que podem mudar das partes que não mudam Depois de descobrir o que irá mudar, a idéia é encapsular isso, trabalhar com uma interface e usar o código sem a preocupação de ter que reescrever tudo caso surjam versões futuras (fraco acoplamento.) Programe para uma interface, e não para uma implementação (concreta) A chave é explorar o polimorfismo e a ligação dinâmica para usar um supertipo (interface ou classe abstrata) e poder trocar objetos distintos (que de fato irão responder as mensagens) em tempo de execução 21

Composição A composição estende uma classe pela delegação de trabalho para outro objeto Em vez de codificar um comportamento estaticamente, definimos e encapsulamos pequenos comportamentos padrão e usamos composição para delegar comportamentos Muitos autores já consideram a composição muito superior à herança em grande parte dos casos Posso mudar a associação entre classes em tempo de execução (estou trabalhando com uma interface!) Permite que um objeto assuma mais de um comportamento A herança deve ser utilizada em alguns (relativamente poucos) contextos Herança acopla as classes demais e engessa o programa 22

Composição em Java 23

O que se procura? O sistema deve permitir o aparecimento de novas armas no Jogo sem grandes impactos negativos (ifelse s) em todas as subclasses concretas Além do surgimento de novas armas, o sistema deve permitir que um personagem mude de arma em tempo de execução (passagem de fases, e.g.) Em vez de já definir a arma estaticamente no código Alguns comportamentos não devem ser compartilhados por todos os personagens Ex.: atirar com um revólver ser executado por um objeto do tipo lutador de Sumô 24

Cenário de uso(3) Se a armas devem mudar, a partir de agora, deve-se separá-las das classes concretas (soldado, general) Elas irão viver em uma classe que implementará uma interface em particular. Dessa forma, Soldado e General não vão precisar saber nenhum detalhe de implementação de seus comportamentos dinâmicos class Desarmado interface Arma_IF { implements Arma_IF { Caso o personagem public void usararma(){ não deva usar arma void usararma(); /* imprime desarmado */; class Fuzil class Revolver implements Arma_IF { implements Arma_IF { public void usararma(){ public void usararma(){ /* imprime rajada */; /* imprime tiro */; 25

Cenário de uso(3) Como foi dito, todas os personagens concretos devem trabalhar com uma referência para alguma coisa que implemente a interface de armas Cada personagem irá delegar seu comportamento de arma em vez definir isso estaticamente no código public abstract class Personagem { Arma_IF arma; public abstract void desenhar(); public void falar(){ /* código comum para falar */ public void setarma(arma_if a){ arma = a; public void arma(){ arma.usararma(); Reduz o acoplamento de código, já que os personagens interagem com interface (em vez de uma implementação) Se um personagem deseja usar sua arma, ele simplesmente delega esta tarefa ao objeto (alguém que tem o método usararma) que está sendo referenciado no momento O polimorfismo e a ligação dinâmica irão cuidar de chamar o método (usararma) correto 26

Diagrama de classes final Cliente Comportamento encapsulado Personagem Arma_IF arma; associação Arma_IF usararma() public void arma(){ arma.usararma(); delegação desenhar() falar() arma() setarma(arma_if) Revolver usararma() Fuzil usararma() Desarmado usararma() Soldado General LutSUMO desenhar() desenhar() desenhar() Estes algoritmos (comportamentos) são perfeitamente intercambiáveis O cliente faz uso de uma família encapsulada de tipos de armas 27

Executando novo código A troca de armas (dinamicamente): public abstract class Personagem { Arma_IF arma; public abstract void desenhar(); public void falar(){ /* código comum para falar */ public void setarma(arma_if a){ arma = a; public class UsaPersonagem { public static void main(string[] args){ public void arma(){ Personagem p; arma.usararma(); p = new Soldado(); p.desenhar(); p.setarma( new Revolver() ); // define arma p.arma(); // imprime Tiro Note a presença a de p.setarma( new Fuzil() ); // trocou arma p.arma(); // imprime Rajada interfaces p = new LutadorSumo(); p.desenhar(); p.setarma( new Desarmado() ); // define arma Ligação dinâmica interno p.arma(); // imprime Desarmado * E se amanhã surgisse uma nova arma (Faca, por ex.)? 28

Considerações: composição e herança Uma das principais atividades em um projeto orientado a objetos é estabelecer relacionamentos entre classes Duas formas básicas de relacionar classes são: herança e a composição Composição e herança não são mutuamente exclusivas As técnicas podem ser usadas em conjunto para obter os melhores resultados de cada uma A herança, geralmente, ocorre mais no design de tipos (uma subclasse é um tipo de...) 29

Considerações: composição e herança No desenvolvimento, porém, a composição de objetos é a técnica predominante Separar o que muda do que não muda (e encapsular estes pequenos comportamentos) Trabalhar com uma interface para manipular estes pequenos comportamentos Trocar comportamentos dinamicamente Programar para uma interface sempre que possível Isso garante um fraco acoplamento entre o códigocliente e as classes concretas (até futuras) 30

Quando usar? Composição ou Herança? ❶ Identifique os componentes do objeto, suas partes Essas partes devem ser agregadas ao objeto via composição (relacionamento do tipo é parte de) ❷ Classifique seu objeto e tente encontrar uma semelhança de identidade com classes existentes Herança só deve ser usada se você puder comparar seu objeto A com outro B dizendo que A É UM tipo de... B Tipicamente, herança só deve ser usada quando você estiver construindo uma família de tipos (relacionados entre si) LEIA! http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques.html 31

Exercícios ❶ Implemente e execute os exemplos mostrados Coloque texto em cada método (um println() para mostrar qual método foi chamado e descrever o que aconteceu) Faça experimentos: (a) insira uma nova arma para os jogadores (uma faca, por ex.); (b) insira novos personagens (um mago que possa soltar alguma magia como arma para se defender) ❷ Para os alunos de excepcional intelecto: O que deve ser alterado no sistema para acomodar um personagem DragãoAlado no sistema? Um dragão pode falar()? E qual é a arma() do dragão? 32