Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

Polimorfismo 
 
Programação em Java 
 
Prof. Maurício Braga 
 
 
2/33 
Pilares da programação OO 
 Encapsulamento 
 
 Herança 
 
 Polimorfismo 
3/33 
Introdução 
 
 Até agora, vimos como obter componentes 
autosuficientes utilizando encapsulamento e como 
fazer reuso através da herança. 
 
 Fato: Software está sempre mudando. 
 
 Necessidade: software capaz de se adaptar para 
satisfazer necessidades futuras. 
4/33 
Software moderno 
 
 Adapta-se a requisitos futuros sem alteração. 
 
 Facilita a realização de mudanças. 
 
 Obtido através do uso do polimorfismo. 
5/33 
Polimorfismo 
 
 Apóia-se nos conceitos de encapsulamento e 
herança, permitindo a construção de softwares 
flexíveis para se adaptar a requisitos futuros. 
 
 Domínio da técnica é fundamental para se aproveitar 
ao máximo as vantagens da programação OO. 
 
6/33 
Polimorfismo 
 
 Mecanismo que adiciona grande flexibilidade a 
programação OO. 
 
 Um mesmo nome pode representar diferentes 
comportamentos, selecionados através de um 
mecanismo automático. 
 
 Permite a uma mesma ação ser implementada de 
diversas maneiras em objetos diferentes. 
 
7/33 
Exemplo Polimorfismo 
A ação abrir pode ser aplicada a diferentes objetos como: 
 
 Porta; 
 
 Conta Bancária; 
 
 Caixa; 
 
 Conexão a um banco de dados. 
8/33 
Polimorfismo 
 
 A ação ‘Abrir’ pode ser aplicada a diferentes objetos. 
 
 Cada objeto pode implementar a ação abrir de uma 
maneira diferente. 
 
 A mensagem abrir pode então ser enviada a 
diferentes objetos, que a realizarão da forma que for 
mais adequada a cada um deles. 
 
9/33 
Polimorfismo 
 O polimorfismo é resolvido dinamicamente 
 
 Ocorre quando uma classe possui um método com o 
mesmo nome e assinatura (número, tipo e ordem dos 
parâmetros) de um método da superclasse. Quando isso 
acontece, dizemos que a subclasse sobrepõe o método 
da superclasse 
10/33 
Polimorfismo 
Elipse 
desenhar() 
Circulo 
desenhar() 
O tratamento do desenhar() 
em Circulo irá sobrescrever 
o desenhar() da Elipse. 
Apesar de herdar o método 
dela e poder reutilizá-lo, ele 
Implementará de outra 
maneira este método 
11/33 
class Circulo extends Elipse { 
 void desenhar () { 
 // código para desenhar um círculo 
 } 
} 
Exemplo polimorfismo 
 class Elipse { 
 void desenhar () { 
 // código para desenhar uma elipse 
 } 
} 
12/33 
Exemplo polimorfismo 
 Elipse figura1 = new Elipse(); 
 Elipse figura2 = new Círculo(); 
 
 figura1.desenhar(); 
 
 figura2.desenhar(); 
 
 
13/33 
Exercício 
 Imagine um programa para gerenciar uma grande loja 
com produtos variados. Tal programa irá conter uma 
classe Produto, definida para um produto genérico. 
 
 Atributos do produto: codigo, nome, preco e desconto_a_vista 
 
 Crie duas subclasses de Produto, CD e Livro. Essas 
classes deverão, assim como Produto, conter um 
construtor, métodos de acesso e um método descricao() 
que retorna uma string que informa o nome da classe e 
o valor de seus atributos. 
 
 Atributos do CD: cantor e produtor. 
 Atributos do Livro: autor e editora; 
14/33 
Exercício 2 
 Em seguida, crie no método main um vetor de Produtos, 
adicionando ao mesmo um Produto, um CD e um Livro. 
Ao final, faça um laço para pegar cada elemento do 
vetor e imprimir na tela a sua descrição. 
 
15/33 
O modificador final 
 Pode ser aplicado à métodos, classes e variáveis. O 
efeito do modificador vai depender sobre que elemento 
ele foi aplicado: 
 
 Classes: Impede que a classe possa ser estendida através de 
herança. 
 Métodos: Impede que o método seja redefinido na subclasse. 
 Variável: Torna a variável uma constante. 
 
16/33 
Classes abstratas 
 Classe que podem conter tanto métodos abstratos 
quanto métodos convencionais. 
 
 Não podem ser instanciadas. Sua utilização exige o uso 
de subclasses que irão implementar os métodos 
abstratos; 
 
 São criadas para serem estendidas. 
 
17/33 
Métodos abstratos 
 Métodos que não possuem corpo (implementação). 
Contém apenas a declaração. 
 
 Sua presença torna a classe automaticamente abstrata. 
 
 Devem ser implementados nas subclasses da classe 
abstrata que os definiu. 
 
18/33 
Classes abstratas 
 Uma classe deve ser declarada abstrata se: 
 
 A classe possui um ou mais métodos abstratos. 
 
 A classe herda um ou mais métodos abstratos, os 
quais não são implementados. 
 
 A classe declara que implementa uma determinada 
interface mas não fornece implementação para todos 
os métodos desta interface. 
 
19/33 
Exemplo 
Considere o exemplo envolvendo herança do slide 
anterior: 
Figura 
Retângulo 
Elipse Polígono 
Triângulo 
Quadrado 
Círculo 
20/33 
Exemplo 
 A classe Figura define uma figura genérica. 
 
 Vimos que cada subclasse dessa hierarquia definida por 
Figura contém um método desenhar. 
 
 Não é possível definir um método desenhar para uma 
figura genérica; este método deve ser abstrato, devendo 
ser implementado em cada subclasse de Figura. 
21/33 
Exemplo 
public abstract class Figura { 
 
 // método abstrato; subclasses de figura devem 
 // fornecer uma implementação para esse método. 
 public abstract void desenhar( ); 
} 
 
A classe Figura poderia ser definida como abstrata, 
como no exemplo abaixo: 
22/33 
Classes abstratas “puras” 
 Possuem apenas métodos abstratos; 
 
 Os atributos, quando presentes, se resumem a 
constantes estáticas; 
 
 Podem ser definidas como interfaces, para maior 
flexibilidade no uso. 
 
23/33 
Interfaces 
 Tipo de classe que possui apenas métodos abstratos; 
Os atributos, se existirem, devem ser public, static e 
final. 
 
 Não podem ser instanciadas. Sua utilização exige o uso 
de uma classe que implemente a interface; 
 
 Classes que desejam implementar uma interface 
utilizam a palavra reservada implements. 
24/33 
Interfaces 
 Funcionam como um “contrato”: Uma classe que 
implementa uma interface deve implementar todos os 
métodos dessa interface; 
 
 Ao implementar uma interface, a classe mantém o 
direito de herdar de outra classe. 
 
 Uma classe pode implementar diversas interfaces, 
incrementando o polimorfismo. 
 
25/33 
Exemplo Interface 
public interface MinhaInterface { 
 public void meuMetodoAbstrato (); 
} 
 
 
26/33 
Exemplo Interface 
public class MinhaClasse implements MinhaInterface { 
 public void meuMetodoAbstrato() { 
 System.out.println(“Método implementado!”); 
 } 
} 
 
 
27/33 
Vantagens do uso de interfaces 
 Aumentam a reusabilidade do software; 
 
 Facilitam a evolução da aplicação; 
 
 Facilitam a utilização de componentes no 
sistema; 
 
 Viabilizam o polimorfismo. 
28/33 
Exercício 
Considere o exemplo envolvendo herança do 
slide anterior: 
Figura 
Retângulo 
Elipse Polígono 
Triângulo 
Quadrado 
Círculo 
29/33 
Exercício 
 Em uma hierarquia como a vista no slide anterior, algumas classes irão 
representar figuras geométricas. Figuras geométricas, ao contrário de 
figuras genéricas, possuem uma área interna simples de calcular. 
 
 Defina uma interface chamada FormaGeometrica que diz respeito apenas a 
figuras geométricas. Essa interface irá conter um método getArea() e um 
método getDescricao. O método getDescricao deverá, nas classes que 
implementem esta interface, retornar uma String com informações sobre a 
instância bem como a área do objeto. Em seguida, construa uma classe 
para representar um Retângulo e uma classe para representar um Círculo. 
Essas classes irão implementar a interface mencionada. 
 
 Por fim, crie no método main um vetor de elementos do tipo 
FormaGeometrica, adicionando ao mesmo objetos do tipo círculo e 
retângulo. Ao final, faça um laço para pegar cada elemento do vetore 
imprimir na tela a sua descrição. 
30/33 
Sobrecarga de métodos 
 É possível ter métodos com o mesmo nome numa 
mesma classe. 
 A lista de parâmetros deve ser diferente. 
 O tipo retornado pode ser diferente. 
 Exemplo: 
 public static int max(int a, int b); 
 public static long max(long a, long b); 
 public static double max(double a, double b); 
31/33 
Sobrecarga de métodos 
 Útil quando: 
 Temos métodos cujo significado independe de seus parâmetros. 
 O conceito veiculado pelo método não muda quando alteramos 
o tipo dos parâmetros. 
 
 No exemplo anterior, se não existisse sobrecarga de 
métodos, teríamos que definir métodos como: 
 public static int max_int(int a, int b); 
 public static long max_long(long a, long b); 
 public static double max_double(double a, double b); 
32/33 
Sobrecarga de métodos 
 Sem a sobrecarga, o método max perderia o seu 
significado, o qual independe dos parâmetros utilizados. 
 
 Mais trabalho para o programador, que teria que lidar 
com vários nomes diferentes para métodos que 
veiculam o mesmo conceito. 
 
 Perda do comportamento polimórfico. 
33/33 
Discussão 
 Ao discutirmos classes abstratas “puras”, foi dito que as 
mesmas poderiam ser definidas como interfaces, para 
se obter uma “maior flexibilidade de uso”. Que 
flexibilidade é essa? 
 
Polimorfismo 
 
Programação em Java 
 
Prof. Maurício Braga

Mais conteúdos dessa disciplina