Programação Orientada a Objetos Engenharia da Computação Professor: Rosalvo Ferreira de Oliveira Neto
Dados Pessoais Rosalvo Ferreira de Oliveira Neto MSc. em ciência da computação (UFPE) rosalvo.oliveira@univasf.edu.br www.univasf.edu.br/~rosalvo.oliveira 3
Tópicos Herança Subtipagem Substituição Variáveis polimórficas
Exemplo do DoME O acrônimo DoME significa Database of Multimedia Entertainment Essencialmente, DoME é uma aplicação que permite armazenar informações sobre CDs e DVDs. A idéia é criar um catálogo de todos os CDs e DVDs que se possui. Os requisitos mínimos que queremos são: Deve permitir que possamos inserir informações sobre CDs e DVDs; Deve armazenar essas informações para que essas informações sejam localizadas depois. E Gere um relatório com todos itens do estoque.
Exemplo do DoME Continuação requisitos Os detalhes que queremos armazenar para CD são: O título do álbum O artista (nome da banda ou cantor) O número de faixa do CD; O tempo total de reprodução; Uma Flag indicando se o produto está disponível; Um comentário.
Exemplo do DoME Continuação requisitos Os detalhes que queremos armazenar para DVD são: O título do DVD; O nome do diretor; O tempo total de reprodução; Uma Flag indicando se o produto está disponível; Um comentário.
Implementando sem Herança public class CD { private String titulo; private String artista; private int numfaixa; private double duracao; private boolean disponivel; private String comentario;
Implementando sem Herança public CD(String atitulo, String aartista, int anumfaixa, double aduracao, boolean adisponivel, String acomentario){ titulo = atitulo; artista = aartista; numfaixa = anumfaixa; duracao = aduracao; disponivel = adisponivel; comentario = acomentario;
Implementando sem Herança Métodos Gets & Sets
public void print(){ Implementando sem Herança System.out.println(" "); System.out.println("titulo: " + titulo); System.out.println("Número de faixa: " + numfaixa); System.out.println("artista: " + artista); System.out.println("duracao: " + duracao); System.out.println("disponivel: " + disponivel); System.out.println("comentario: " + comentario);
public class DVD { Implementando sem Herança private String titulo; private String diretor; private double duracao; private boolean disponivel; private String comentario;
Implementando sem Herança public DVD(String atitulo, String adiretor, double aduracao, boolean adisponivel, String acomentario){ titulo = atitulo; diretor = adiretor; duracao = aduracao; disponivel = adisponivel; comentario = acomentario;
Implementando sem Herança Métodos Gets & Sets
public void print(){ Implementando sem Herança System.out.println(" "); System.out.println("titulo: " + titulo); System.out.println("diretor: " + diretor); System.out.println("duracao: " + duracao); System.out.println("disponivel: " + disponivel); System.out.println("comentario: " + comentario);
Implementando sem Herança import java.util.arraylist; public class DataBase { private ArrayList<DVD> listadvd; private ArrayList<CD> listacd; public DataBase(){ listacd = new ArrayList<CD>(); listadvd = new ArrayList<DVD>();
Implementando sem Herança public void inserircd(cd acd){ listacd.add(acd); public void inserirdvd(dvd advd){ listadvd.add(advd);
Implementando sem Herança public void imprimirestoque(){ System.out.println("Imprimindo todos os CDs"); for (CD lcd: listacd){ lcd.print(); System.out.println(" "); System.out.println("Imprimindo todos os DVDs"); for (DVD ldvd: listadvd){ ldvd.print();
Vantagens da Herança Evitar duplicação de código; Reutilização de código; Manutenção mais fácil; Extensibilidade.
Utilizando Herança A herança permite definir uma classe como uma extensão de outra. Uma superclasse é uma classe estendida por outra classe. Uma subclasse é uma classe que estende (herda de) outra classe. Ela herda todos os campos e métodos de sua superclasse.
Hierarquias de classes Animal Mamífero Ave Cão Gato Galinha Pardal
Herança em JAVA Public class Animal{... Public class Mamifero extends Animal{...
Construtor de superclasse O construtor de uma subclasse sempre deve invocar o construtor da sua superclasse como sua primeira instrução. Se o código-fonte não incluir essa chamada, o Java tentará inserir uma chamada automaticamente. A chamada equivalente é: Super();
Variáveis e subtipos Variáveis podem armazenar objetos de seu tipo declarado ou de qualquer subtipo de seu tipo declarado. Exemplo: Veículo Carro Bicicleta Veiculo v1 = new Veículo(); Veiculo v2 = new Carro(); Veiculo v3 = new Bicicleta();
Substituição Os objetos de subtipo podem ser utilizados onde quer que os objetos de um supertipo sejam esperados. Isso é chamado de substituição. Carro c1 = new Veiculo(); // Isso é um erro! Carro c1 = new Bicicleta(); // Isso é um erro!
Conversão de tipo (cast) Às vezes a regra que não podemos atribuir de um supertipo a um subtipo é mais restritiva do que necessária. Por exemplo: Veiculo v; Carro c = new Carro(); v = c; // Correto c = v; // Erro Utilizando um operador de conversão de tipo: c = (Carro) v; // Correto
Polimorfismo Possibilidade de uma classe possuir mais de um método com mesmo nome porém com parâmetros diferentes; Um objeto pode responder de diferentes maneiras a um método de mesmo nome; A decisão de qual método chamar é feita em tempo de execução; A classe que sofreu a invocação procura por um método que possa ser aplicado. Caso não encontre a procura é repassada para a superclasse. Obs: Caso a resolução da chamada de métodos seja feita em tempo de compilação, chama-se overloading.
Polimorfismo de métodos Polimorfismo de métodos Chamadas de métodos em java são polimórficas. A mesma chamada de método pode, em momentos diferentes, invocar diferentes métodos, dependendo do tipo dinâmico da variável utilizada para fazer essa chamada. O tipo estático de uma variável V é o tipo declarado no código-fonte na instrução de declaração de variável. O tipo dinâmico de uma variável V é o tipo de objeto que está atualmente armazenado em V.
Chamadas super em métodos Super.nomeDoMétodo(Parametros);
Novo Exercício Implementar o Exemplo do DoME utilizando Herança!
Implementando com Herança public class Produto { private String titulo; private double duracao; private boolean disponivel; private String comentario;
Implementando com Herança public Produto(String atitulo, double aduracao, boolean adisponivel, String acomentario){ titulo = atitulo; duracao = aduracao; disponivel = adisponivel; comentario = acomentario;
Implementando com Herança Métodos Gets & Sets
Implementando com Herança public void print(){ System.out.println(" "); System.out.println("titulo: " + titulo); System.out.println("duracao: " + duracao); System.out.println("disponivel: " + disponivel); System.out.println("comentario: " + comentario);
Implementando com Herança public class CD extends Produto{ private String artista; private int numfaixa;
Implementando com Herança public CD(String atitulo, double aduracao, boolean adisponivel, String acomentario, String aartista, int anumfaixa){ super(atitulo, aduracao, adisponivel, acomentario); this.artista = aartista; this.numfaixa = anumfaixa;
Implementando com Herança Métodos Gets & Sets
Implementando com Herança public void print(){ super.print(); System.out.println("artista: " + artista); System.out.println("Número de Faixas: " + numfaixa); System.out.println(" ");
Implementando com Herança public class DVD extends Produto{ private String diretor; public DVD(String atitulo, double aduracao, boolean adisponivel, String acomentario, String adiretor){ super(atitulo, aduracao, adisponivel, acomentario); diretor = adiretor;
Implementando com Herança public void print(){ super.print(); System.out.println("Diretor: " + diretor);
Implementando com Herança import java.util.arraylist;; public class DataBase { private ArrayList<Produto> listaprodutos; public DataBase(){ listaprodutos = new ArrayList<Produto>();
Implementando com Herança public void inserirproduto(produto aproduto){ listaprodutos.add(aproduto); public void imprimirestoque(){ for(produto lproduto: listaprodutos){ lproduto.print();
Dúvidas