POO29004 – Programação Orientada a Objetos Classe abstrata, interfaces e polimorfismo Prof. Emerson Ribeiro de Mello Instituto Federal de Santa Catarina – IFSC campus São José [email protected] http://docente.ifsc.edu.br/mello/poo 23 de março de 2017 1/16 Classe abstrata Principal uso Servir de base para concepção de subclasses Contém um ou mais métodos abstratos Métodos que não possuem implementação Tem por objetivo indicar que devem ser obrigatoriamente sobrescritos nas subclasses. Também pode conter métodos concretos Métodos que possuem implementação Não necessitam ser sobrescritos nas subclasses Não é possı́vel instanciar objetos de uma classe abstrata Uma subclasse que não prover implementações para os métodos abstratos herdados, deve obrigatoriamente ser abstrata 2/16 Exemplo: Classe abstrata Personagem 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public abstract class Personagem{ private int id; private String nome; public Personagem(int i, String n){ this.id = i; this.nome = n; } public String obterNome(){ return this.nome; } public void imprimirDados(){ System.out.println("Id:" + this.id + ", Nome: " + this.nome); } // metodo abstrato que deve ser implementado na subclasse public abstract void atacar(float intensidade); } 3/16 Exemplo: Classe concreta Arqueiro 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 public class Arqueiro extends Personagem{ private int habilidade; public Arqueiro(int i, String n, int h){ super(i,n); this.habilidade = h; } public void imprimirDados(){ super.imprimirDados(); System.out.println("Habilidade: " + this.habilidade); } // implementacao do metodo abstrato herdado public void atacar(float intensidade){ System.out.println("Disparando flechas com a intensidade: " + intensidade); } } 4/16 Prática 1 Crie uma classe abstrata Pessoa e duas classes concretas, Aluno e Professor, que herdam da classe Pessoa Cada classe deve ter no mı́nimo 2 atributos especı́ficos e um método construtor que inicia todos atributos Classe Pessoa deverá possuir 1 método concreto e 1 método abstrato 2 Crie uma classe Principal e nesta crie uma instância para cada classe e invoque alguns de seus métodos 5/16 Interface Nota: Java 8 permite que interfaces tenham métodos concretos Semelhante a uma classe abstrata, pois não se pode instanciar objetos de uma interface Porém, todos atributos são por padrão, public, static e final Interface só pode ser implementada por Classes e só pode ser estendida por outras Interfaces 6/16 Interface Nota: Java 8 permite que interfaces tenham métodos concretos Semelhante a uma classe abstrata, pois não se pode instanciar objetos de uma interface Porém, todos atributos são por padrão, public, static e final Interface só pode ser implementada por Classes e só pode ser estendida por outras Interfaces Uso classe abstrata ou interface? Se vários objetos são de um mesmo tipo e compartilham um estado e um comportamento comum, então estes objetos tendem a ser derivados de uma mesma classe Se este objetos só compartilham um conjunto de assinaturas de métodos, então tendem a implementar uma interface 6/16 Exemplo: Interface Carro 34 35 36 37 38 39 public interface Carro{ // ilustrando o uso de constantes em uma interface. public static final String nome = "Carro"; // todo metodo e' abstrato por padrao public void frear(int intensidade); } 7/16 Exemplo: Interface Carro 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 public interface Carro{ // ilustrando o uso de constantes em uma interface. public static final String nome = "Carro"; // todo metodo e' abstrato por padrao public void frear(int intensidade); } public class Fusca implements Carro{ private String modelo; public Fusca(String m){ this.modelo = m; } public void frear(int intensidade){ System.out.println("Encostando a lona no tambor de freio"); } } 7/16 Herança múltipla em Java Em Java não é possı́vel que uma classe herde de duas ou mais classes Em Java uma classe pode implementar uma ou mais interfaces Resumo Uma classe pode herdar de uma única classe e ainda assim implementar uma ou mais interfaces 8/16 Exemplo: Herança múltipla para obtermos um Triatleta Corredor pode correr Ciclista pode pedalar Nadador pode nadar 9/16 Exemplo: Herança múltipla para obtermos um Triatleta Corredor pode correr Ciclista pode pedalar Nadador pode nadar Desenhe um diagrama de classes UML 1 Uma classe para representar cada atleta, sabendo que todos devem possuir um nome e um CPF Robson Caetano, Miguel Indurain e Cesar Cielo 2 Uma classe para representar um Triatleta, que pode correr, pedalar e nadar. Este também possui um nome e CPF 9/16 Exemplo: Herança múltipla para obtermos um Triatleta 10/16 Polimorfismo A palavra polimorfismo significa “muitas formas” Na POO o polimorfismo nos permite desenvolver e implementar sistemas que sejam facilmente extensı́veis Novas classes podem ser adicionadas ao sistema com pouca ou nenhuma modificação nas partes gerais do sistema Novas classes devem obrigatoriamente fazer parte de uma hierarquia de classes já existente no sistema Como usufruir do Polimorfismo Programe pensando somente nas classes mais genéricas, não se preocupando com as classes mais especı́ficas, haja visto que os métodos existentes na superclasse também estarão presentes nas subclasses 11/16 Exemplo: Jogo Java of Empires Existem três personagens: Aldeão, Arqueiro e Cavaleiro Todos compartilham algum tipo de informação e comportamento, logo, todos herdam da classe Personagem Todo personagem possui um iD único no jogo e todo personagem poderá se mover pelo cenário Aldeão se move por 1 unidade, Arqueiro por 2 unidades e o Cavaleiro por 10 unidades 49 50 51 Aldeao a = new Aldeao(); Arqueiro aq = new Arqueiro(); Cavaleiro c = new Cavaleiro(); 52 53 54 // invocando o metodo mover de cada objeto a.mover(); aq.mover(); c.mover(); 12/16 Exemplo: Jogo Java of Empires Em um jogo que permite até 300 personagens, o ideal seria fazer uso de vetores 55 56 57 Aldeao vetA[] = new Aldeao[100]; Arqueiro vetAQ[] = new Arqueiro[100]; Cavaleiro vetC[] = new Cavaleiro[100]; 58 59 //omitindo a criacao dos objetos 60 61 62 63 64 // invocando o metodo mover de cada objeto for(int i = 0; i < 100; i++){ vetA[i].mover(); vetAQ[i].mover(); vetC[i].mover(); } 13/16 Exemplo: Jogo Java of Empires Em um jogo que permite até 300 personagens, o ideal seria fazer uso de vetores 55 56 57 Aldeao vetA[] = new Aldeao[100]; Arqueiro vetAQ[] = new Arqueiro[100]; Cavaleiro vetC[] = new Cavaleiro[100]; 58 59 //omitindo a criacao dos objetos 60 61 62 63 64 // invocando o metodo mover de cada objeto for(int i = 0; i < 100; i++){ vetA[i].mover(); vetAQ[i].mover(); vetC[i].mover(); } E se criarmos um novo personagem Navio? Será necessário modificar o código dentro do laço de repetição 13/16 Exemplo: Jogo Java of Empires Com o polimorfismo é possı́vel incluir novos personagens no jogo sem que seja preciso modificar boa parte do código Sempre programar para o “geral” e nunca para o especı́fico. 65 66 67 68 69 70 71 72 // pensando no mais generico. Reservando um vetor da superclasse Personagem vetP[] = new Personagem[4]; // O vetor da superclasse pode armazenar objetos das suas subclasses // o inverso nao e' verdade! vetP[0] = new Aldeao(); vetP[1] = new Arqueiro(); vetP[2] = new Cavaleiro(); vetP[3] = new Navio(); 73 74 75 76 77 78 // o metodo mover existe na superclasse. No tempo de execucao sao invocados // os metodos de cada subclasse for(int i=0; i < 4; i++){ vetP[i].mover(); } 14/16 Prática No exercı́cio anterior foram criadas as classes Pessoa, Aluno e Professor Faça uso do conceito de Polimorfismo e: Crie um vetor de Pessoas de tamanho 10 e dentro desse vetor crie 5 instâncias da classe Aluno e 5 instâncias da classe Professor Imprima os dados de todos Alunos e Professores 15/16 Lista 02 – Trabalho individual – Entrega 30/03/17 1 Faça assinatura do projeto no Github Classroom 2 Implementar classes para representar Arqueiro e Cavaleiro Estudar o código e propor uma solução que faça uso dos conceitos de Herança e Polimorfismo https://goo.gl/Gy4TW9 3 16/16