Vous êtes sur la page 1sur 35

Polimorfismo

Programação em Java

Prof. Maurício Braga


Pilares da programação OO

◼ Encapsulamento

◼ Herança

◼ Polimorfismo

2/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.

3/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.

4/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,
reduzindo o esforço da manutenção.

◼ Domínio da técnica é fundamental para se aproveitar


ao máximo as vantagens da programação OO.

5/33
Polimorfismo

◼ Em essência permite que um objeto possa ser de


várias formas, e que outros objetos possam interagir
com ele sem saber de que forma específica ele é.

◼ Permite que um mesmo nome possa 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.

6/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.

7/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.

8/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

9/33
Polimorfismo

Elipse O tratamento do desenhar()


em Circulo irá sobrescrever
o desenhar() da Elipse.
desenhar()
Apesar de herdar o método
dela e poder reutilizá-lo, ele
Implementará de outra
Circulo maneira este método

desenhar()

10/33
Exemplo polimorfismo
class Elipse {
void desenhar () {
// código para desenhar uma elipse
}
}

class Circulo extends Elipse {


void desenhar () {
// código para desenhar um círculo
}
}

11/33
Exemplo polimorfismo

Elipse figura1 = new Elipse();


Elipse figura2 = new Círculo();

figura1.desenhar();

figura2.desenhar();

12/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;
13/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.

14/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.

15/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.

16/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.

17/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.

18/33
Exemplo
Considere o exemplo envolvendo herança do slide
anterior:
Figura

Polígono Elipse

Triângulo Retângulo Círculo

Quadrado

19/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.

20/33
Exemplo
A classe Figura poderia ser definida como abstrata,
como no exemplo abaixo:

public abstract class Figura {

// método abstrato; subclasses de figura devem


// fornecer uma implementação para esse método.
public abstract void desenhar( );
}

21/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.

22/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.

23/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.

24/33
Interfaces

◼ Aumentam o nível de reusabilidade.

◼ Facilitam a criação de arquiteturas baseadas em


componentes.

◼ Reduzem o esforço de evolução do software.

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

Polígono Elipse

Triângulo Retângulo Círculo

Quadrado

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 vetor e
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?

34/33
Polimorfismo

Programação em Java

Prof. Maurício Braga

Vous aimerez peut-être aussi