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