Baixe o app para aproveitar ainda mais
Prévia do material em texto
Linguagem de Programação I Herança Joinvile Batista Junior UFGD - LPI 08 - Joinvile Batista Junior 22 Utilização correta da Herança • a semântica (significado) do conceito de herança exige que a subclasse seja uma especialização da superclasse – Carro é um Veiculo : herança bem definida – Carro não é um Motor : herança incorreta • Carro não deve herdar atributos do Motor por conveniência de implementação • carro deverá acessar atributos do motor (ex. potência) através dos métodos de Motor (lerPotência) UFGD - LPI 08 - Joinvile Batista Junior 33 Sub Classe herda da Super Classe • super classe – define atributos e métodos comuns que serão herdados por suas subclasses • subclasses (mais específicas) podem – herdar da superclasse : atributos, relacionamentos e métodos comuns de uma superclasse de objetos – acrescentar : atributos, relacionamentos e métodos específicos – redefinir o comportamento de métodos herdados UFGD - LPI 08 - Joinvile Batista Junior 44 Super Classe fatora Dados Comuns • Super classe : Obra – define dados comuns às subclasses : título, autor • Sub classe : Livro – herda dados comuns : título, autor – define dados específicos : editora, edição, ano publicação • Sub Classe : Tese – herda dados comuns : título, autor – define dados específicos : universidade, orientador, data • Sub Classe : Relatório Técnico – herda dados comuns : título, autor – define dados específicos : empresa, grau de sigilo, data UFGD - LPI 08 - Joinvile Batista Junior 55 Redefinindo o Comportamento de um Método Herdado • Super classe : Obra – define método descrição que gera um string concatenando os strings de título e autor • public String descrição () { bloco_método } • Sub classe : Livro – redefine o corpo do método descrição herdado, concatenando os strings de : título, autor, editora, edição, ano publicação • Sub Classe : Tese – redefine o corpo do método descrição herdado, concatenando os strings de : título, autor, universidade, orientador, data • Sub Classe : Relatório Técnico – redefine o corpo do método descrição herdado, concatenando os strings de : título, autor, empresa, grau de sigilo, data UFGD - LPI 08 - Joinvile Batista Junior 66 Conceituando o Polimorfismo na Sobreposição de Métodos • um método definido na super classe pode ser sobreposto (ter seu corpo redefinido) nas sub classes • pelo fato do método sobreposto ter o mesmo cabeçalho (mesma assinatura e mesmo tipo de retorno) do método herdado (pois somente o corpo foi redefinido) – objetos pertencentes a uma mesma hierarquia de classes podem responder a uma mesma solicitação (chamada ao mesmo método) • uma operação pode ser solicitada a um objeto de uma determinada superclasse ou a um objeto de qualquer subclasse derivada – o solicitante da operação não necessita saber se o objeto pertence à superclasse ou qualquer uma de suas subclasses • se a instância de objeto pertence à superclasse – será executado o comportamento definido pela operação da superclasse • se a instância de objeto pertence à subclasse – será executado o comportamento definido pela operação redefinida na subclasse ou definida unicamente na superclasse UFGD - LPI 08 - Joinvile Batista Junior 77 Utilizando a Sobreposição de Métodos • uma variável definida com uma superclasse pode receber um objeto da superclasse ou um objeto de qualquer uma de suas subclasses – definindo a variável com a super classe : Obra obra; – atribuição 1 : obra = new Obra (“Java”, “Deitel”); – atribuição 2 : obra = new Livro (“Java”, “Deitel”, “Pearson, 8, 2010); – atribuição 3 : obra = new Tese (“Agentes”, “Adriana”, “UFGD”, “Claudia”, “10Out11”); – atribuição 4 : obra = new Relatório (“Busca Semântica”, “Silvia”, “Google”, Relatório.Sigilo.público, “11Set2008”); • quando o solicitante chamar o método descrição – String texto = obra.descricão (); • o String retornado será função de qual objeto foi atribuido à variável obra – 1 : texto = título + autor – 2 : texto = título + autor + editora + edição + ano_publicação – 3 : texto = título + autor + universidade + orientador + data – 4 : texto = título + autor + empresa + grau de sigilo + data UFGD - LPI 08 - Joinvile Batista Junior 88 Chamada de Métodos • atribuir um objeto de subclasse a uma variável de superclasse Obra obra = new Livro (“Java”, “Deitel”, “Pearson”, 8, 2010); • chama método definido somente na superclasse String titulo = obra.getTitulo(); • chama método sobreposto na subclasse String descrição = obra.descrição(); // retorna atributos do livro • chama método definido somente na subclasse – alternativa 1: converte para subclasse na chamada do método String editora = ((Livro)obra).getEditora (); – alternativa 2: converte para subclasse e depois chama método Livro livro = (Livro) obra; String editora = livro.getEditora (); UFGD - LPI 08 - Joinvile Batista Junior 99 Super Classe Obra package entidade; public class Obra { protected String título; protected String autor; public Obra (String título, String autor) { this.titulo = título; this.autor = autor; } public String getTitulo () { return título; } public void setTitulo (String título) { this.título = título; } public String getAutor () { return autor; } public void setAutor (int autor) { this.autor = autor; } public String descrição () { return "Livro: " + título + "\n Autor: " + autor; } } UFGD - LPI 08 - Joinvile Batista Junior 1010 Subclasse Livro package entidade; public class Livro extends Obra { private String editora; private int edição; private int ano_publicação; public Livro (String título, String autor, String editora, int edição, int ano_publicação) { super (título, autor); this.editora = editora; this.edição = edição; this.ano_publicação = ano_publicação; } UFGD - LPI 08 - Joinvile Batista Junior 1111 Subclasse Livro public String getEditora () { return editora; } public void setEditora (String editora) { this.editora = editora; } public int getEdição () { return edição; } public void setEdição (int edição) { this.edição = edição; } public int getAnoPublicação () { return ano_publicação; } public void setAnoPublicação (int ano_publicação) { this.ano_publicação = ano_publicação; } public String descrição () { return "Livro: " + título + "\n Autor: " + autor + "\n Editora: " + editora + "\n Edição: " + edição + "\n Ano de Publicação: " + ano_publicação; } } UFGD - LPI 08 - Joinvile Batista Junior 1212 Classe Principal package controle; public class Principal { static Obra[] obras = new Obra[3]; public static void main (String[] args) { inicializaObras (); imprimeObras (); } UFGD - LPI 08 - Joinvile Batista Junior 1313 Classe Principal private static void inicializaObras () { obras[0] = new Livro ("Core Java", "Horstman - Cornell", "Sun Microsystems Press", 1, 1999); obras[1] = new Tese ("Desenvolvimento de Aplicações Críticas", "Paulo Oliveira", "Unicamp", "Roberto Sobral", “29Nov2007”); obras[2] = new Relatório ("Java para Software Embarcado", "Adriana Messias", "Software Design", 0, ‘’30Set2012”); } private static void imprimeObras () { for (int n = 0; n < obras.length; n++) { System.out.println (obras[n].descrição()); } } } UFGD - LPI 08 - Joinvile Batista Junior 1414 Exercícios - 8 • 8.1 – Complemente o programa com a definição das classes : Tese e Relatório. • 8.2 – Transforme o programa da Biblioteca em uma Concessionária que comercializa os seguintes veículos: carros, motos e caminhões.
Compartilhar