Programação Orientada a Objetos



       Polimorfismo e Classes
             Abstratas



          Ludimila Monjardim Casagrande
                      2012
Polimorfismo e Herança

      O mecanismo de herança permite a criação de
          classes a partir de outras já existentes desde
          que exista a relação “é um” entre a subclasse e
          a superclasse.
      Dessa forma é possível criar classes mais
          especializadas a partir de uma classe genérica.
      A relação “é um” entre classes também permite
          a existência de outra característica fundamental
          das linguagens OO que é o polimorfismo.

Polimorfismo            ©2012 Ludimila Monjardim Casagrande   2
Polimorfismo e Herança
                                                         Uma Figura Geométrica
                                       Figura            é uma generalização de
                                                         múltiplas formas



       Quadrado é uma                                            Círculo é uma
       Figura Geométrica                                         Figura Geométrica

                      Quadrado                            Círculo




Polimorfismo               ©2012 Ludimila Monjardim Casagrande                       3
Polimorfismo

      Polimorfismo, que significa “múltiplas formas”,
          permite a manipulação de instâncias de classes
          que herdam de uma mesma classe ancestral de
          forma unificada:
            Assim, é possível escrever métodos que
             recebam instâncias de uma classe C, e os
             mesmos métodos serão capazes de processar
             instâncias de qualquer classe que herde de C, já
             que qualquer classe que herde de C “é um” C.


Polimorfismo             ©2012 Ludimila Monjardim Casagrande    4
Exemplo de Polimorfismo
                                    public class VetorFiguras{

                                         private Figura[] figuras = new Figura[10];
                                         private int totalDeElementos;

                                         public boolean contem(Figura fig) {
                                            boolean resultado = false;
                                            for(int i = 0; i < this.totalDeElementos; i++){
                                                if(fig.equals(this.figuras[i])){
                                                     resultado = true;
  Quadrado q = new Quadrado(2.0);                    break;
  Circulo c = new Circulo(2.0);                 }
                                            }
  if(vetor.contem(q))                       return resultado;
      ...                                }
  if(vetor.contem(c))               }
      ...

Polimorfismo                ©2012 Ludimila Monjardim Casagrande                           5
Exemplo de Polimorfismo
                       public class Vetor {

                            private Object[ ] objetos = new Object[10];
                            private int totalDeElementos;

                             public boolean contem(Object obj) {
                               boolean resultado = false;
                               for(int i = 0; i < this.totalDeElementos; i++){
                                   if(obj.equals(this.objetos[i])){
                                        resultado = true;
                                        break;
                                   }
                               }
                               return resultado;
                             }
                       }


Polimorfismo   ©2012 Ludimila Monjardim Casagrande                           6
Polimorfismo

      Polimorfismo é o princípio pelo qual duas ou
          mais classes derivadas de uma mesma
          superclasse podem invocar métodos que têm a
          mesma identificação (assinatura) mas
          comportamentos distintos, especializados para
          cada classe derivada, usando para tanto uma
          referência a um objeto do tipo da superclasse.




Polimorfismo            ©2012 Ludimila Monjardim Casagrande   7
Polimorfismo

      Em outras palavras, polimorfismo é a
          capacidade de se enviar a mesma mensagem a
          objetos de classes diferentes, por meio de um
          mesmo tipo base comum a estes objetos.




Polimorfismo           ©2012 Ludimila Monjardim Casagrande   8
Exemplo de Polimorfismo
 public class Figura {
    public double calcularArea( ) {
        return 0;
    }
 }
 public class Quadrado extends Figura {  Herança
    double lado;
    public Quadrado(double lado) {
        this.lado = lado;
    }

      public double calcularArea( ) {      Sobreposição do método da
         double area = 0;                   superclasse
         area = lado * lado;
         return area;
      }
 }
Polimorfismo                   ©2012 Ludimila Monjardim Casagrande      9
Exemplo de Polimorfismo
 public class Circulo extends Figura {  Herança
      double raio;

      public Circulo (double raio) {
         this.raio = raio;
      }

      public double calcularArea( ) {         Sobreposição do método da
         double area = 0;                      superclasse.
         area = 3.14 * raio * raio;
         return area;
      }
 }



Polimorfismo                   ©2012 Ludimila Monjardim Casagrande         10
Exemplo de Polimorfismo
 public class Principal {

      public static void main(String[ ] args) {

          Figura f1 = new Quadrado(4);

          Figura f2 = new Circulo(2);

          System.out.println("Área da Figura 1 é: "        Comportamento
                              + f1.calcularArea( ) + "n"   polimórfico.
                              + "Área da Figura 2 é: "
                              + f2.calcularArea( ));

      }        Um mesmo tipo base Figura, por meio das variáveis f1 e f2, é utilizado
 }             para enviar uma mesma mensagem calcularArea para objetos de tipos
               diferentes Quadrado e Circulo e o comportamento executado será
               distinto.

Polimorfismo                    ©2012 Ludimila Monjardim Casagrande                     11
Exemplo de Polimorfismo
 public class VetorFiguras {

      private Figura[] figuras = new Figura[10];
      private int totalDeElementos;

      public double calcularAreaTotal() {
         double areaTotal = 0;
         for (int i = 0; i < figuras.length; i++) {
             if (figuras[i] != null) {
                  areaTotal = areaTotal + figuras[i].calcularArea();  Comportamento
             }                                                         polimórfico.
         }
         return areaTotal;
      }
 }

Polimorfismo                  ©2012 Ludimila Monjardim Casagrande                 12
Outro Exemplo

                                                                     A fila de impressão
               FilaImpressao                        Documento        armazena objetos
                                 imprime()                           genéricos do tipo
                                                                     Documento

                                                    imprime()

 A mensagem
 transmitida é: imprima
 todos os Documentos
 da fila                       DocWord               DocExcel         DocPDF

 Cada tipo de
 documento conhece
 seus detalhes de              imprime()            imprime()        imprime()
 impressão


Polimorfismo                   ©2012 Ludimila Monjardim Casagrande                         13
Vantagens do Polimorfismo

      Já vimos que o grande benefício do
          polimorfismo é permitir que vários objetos de um
          mesmo tipo base sejam tratados da mesma
          maneira.
      Uma outra vantagem é permitir aumentar um
          software de maneira mais controlada, mais
          localizada.




Polimorfismo            ©2012 Ludimila Monjardim Casagrande   14
Vantagens do Polimorfismo

      Considere o exemplo da fila de impressão. Se
          quisermos incrementar o software e permitir que
          novos tipos de documentos sejam impressos, a
          classe FilaImpressao não precisa ser alterada.
      Somente novas classes precisam ser criadas
          para implementar os novos tipos de
          documentos. Assim, o trabalho é menor e mais
          localizado, evitando que erros de programação
          sejam inseridos na classe FilaImpressao.


Polimorfismo            ©2012 Ludimila Monjardim Casagrande   15
Classes Abstratas

     Vimos no exemplo das classes de figuras
         geométricas, que a classe Figura implementa o
         método calcularArea, porém o método somente
         retorna 0 e não realiza nenhum cálculo.
     Isso foi feito para que a classe base Figura
         definisse o comportamento padrão para toda a
         hierarquia de classes de figuras geométricas,
         assim todos os objetos das classes derivadas
         podem ser tratados da mesma maneira (pelo
         polimorfismo).

Polimorfismo           ©2012 Ludimila Monjardim Casagrande   16
Classes Abstratas

      Uma outra maneira de implementar o
          comportamento padrão para toda uma
          hierarquia de classes é fazendo com que a
          classe base seja uma classe abstrata.
      Uma classe abstrata é uma classe que não
          pode ser instanciada, isto é, nenhum objeto
          daquela classe pode ser criado.
      Uma classe abstrata serve apenas para definir
          um comportamento comum que todas as
          classes derivadas devem seguir.

Polimorfismo            ©2012 Ludimila Monjardim Casagrande   17
Classes Abstratas

      Para alterar a classe Figura e torná-la abstrata,
          basta acrescentar a palavra-chave do Java
          abstract na sua declaração:
          public abstract class Figura {
             public double calcularArea( ) {
                 return 0;
             }
          }




Polimorfismo               ©2012 Ludimila Monjardim Casagrande   18
Classes Abstratas

      Desse modo, nenhum objeto da classe Figura
          pode ser criado e a linha abaixo causará um
          erro de compilação:
           Figura f = new Figura( );




Polimorfismo              ©2012 Ludimila Monjardim Casagrande   19
Métodos Abstratos

      O Java permite que métodos sejam definidos
          como abstratos e, portanto, sem nenhuma
          implementação.
      Para criar um método abstrato, usamos a
          palavra-chave abstract na assinatura do método
          e omitimos o seu corpo (já que não há
          implementação):
          public abstract class Figura {
             public abstract double calcularArea( );
          }
Polimorfismo               ©2012 Ludimila Monjardim Casagrande   20
Regras sobre Classes Abstratas

      Toda classe derivada de uma classe abstrata
          deve obrigatoriamente implementar os métodos
          abstratos da superclasse, caso contrário, um
          erro de compilação é gerado.
      Uma classe que tenha um ou mais métodos
          abstratos deve ser obrigatoriamente definida
          como abstrata, caso contrário um erro de
          compilação é gerado.



Polimorfismo            ©2012 Ludimila Monjardim Casagrande   21
Regras sobre Classes Abstratas

      Uma classe abstrata pode conter métodos não
          abstratos, isto é, métodos com implementação.
      Se esses métodos não abstratos não forem
          definidos (sobrepostos) nas subclasses, então,
          quando um objeto da subclasse realizar a
          chamada a um desses métodos, o código
          contido na classe abstrata será executado
          (devido à herança).



Polimorfismo            ©2012 Ludimila Monjardim Casagrande   22
Exemplo
  public abstract class Figura {
    public abstract double calcularArea( );
    public void imprimeArea( ) {
       System.out.println(calcularArea( ));
    }
  }
  public class Principal {
      public static void main(String[] args) {
         Quadrado q = new Quadrado(4);
         Circulo c = new Circulo(2);
         System.out.print("Área da Figura 1 é: ");
         q.imprimeArea( );
         System.out.print("Área da Figura 2 é: ");
         c.imprimeArea( );
      }
  }
Polimorfismo                 ©2012 Ludimila Monjardim Casagrande   23
Bibliografia Sugerida

      Java: Como programar
          Autores: H. M. Deitel e P. J. Deitel
          Editora: Pearson – 6a Edição

      Complete Java 2 Certification
          Study Guide
          Sybex




Polimorfismo             ©2012 Ludimila Monjardim Casagrande   24

POO - 16 - Polimorfismo

  • 1.
    Programação Orientada aObjetos Polimorfismo e Classes Abstratas Ludimila Monjardim Casagrande 2012
  • 2.
    Polimorfismo e Herança  O mecanismo de herança permite a criação de classes a partir de outras já existentes desde que exista a relação “é um” entre a subclasse e a superclasse.  Dessa forma é possível criar classes mais especializadas a partir de uma classe genérica.  A relação “é um” entre classes também permite a existência de outra característica fundamental das linguagens OO que é o polimorfismo. Polimorfismo ©2012 Ludimila Monjardim Casagrande 2
  • 3.
    Polimorfismo e Herança Uma Figura Geométrica Figura é uma generalização de múltiplas formas Quadrado é uma Círculo é uma Figura Geométrica Figura Geométrica Quadrado Círculo Polimorfismo ©2012 Ludimila Monjardim Casagrande 3
  • 4.
    Polimorfismo  Polimorfismo, que significa “múltiplas formas”, permite a manipulação de instâncias de classes que herdam de uma mesma classe ancestral de forma unificada:  Assim, é possível escrever métodos que recebam instâncias de uma classe C, e os mesmos métodos serão capazes de processar instâncias de qualquer classe que herde de C, já que qualquer classe que herde de C “é um” C. Polimorfismo ©2012 Ludimila Monjardim Casagrande 4
  • 5.
    Exemplo de Polimorfismo public class VetorFiguras{ private Figura[] figuras = new Figura[10]; private int totalDeElementos; public boolean contem(Figura fig) { boolean resultado = false; for(int i = 0; i < this.totalDeElementos; i++){ if(fig.equals(this.figuras[i])){ resultado = true; Quadrado q = new Quadrado(2.0); break; Circulo c = new Circulo(2.0); } } if(vetor.contem(q)) return resultado; ... } if(vetor.contem(c)) } ... Polimorfismo ©2012 Ludimila Monjardim Casagrande 5
  • 6.
    Exemplo de Polimorfismo public class Vetor { private Object[ ] objetos = new Object[10]; private int totalDeElementos; public boolean contem(Object obj) { boolean resultado = false; for(int i = 0; i < this.totalDeElementos; i++){ if(obj.equals(this.objetos[i])){ resultado = true; break; } } return resultado; } } Polimorfismo ©2012 Ludimila Monjardim Casagrande 6
  • 7.
    Polimorfismo  Polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma identificação (assinatura) mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse. Polimorfismo ©2012 Ludimila Monjardim Casagrande 7
  • 8.
    Polimorfismo  Em outras palavras, polimorfismo é a capacidade de se enviar a mesma mensagem a objetos de classes diferentes, por meio de um mesmo tipo base comum a estes objetos. Polimorfismo ©2012 Ludimila Monjardim Casagrande 8
  • 9.
    Exemplo de Polimorfismo public class Figura { public double calcularArea( ) { return 0; } } public class Quadrado extends Figura {  Herança double lado; public Quadrado(double lado) { this.lado = lado; } public double calcularArea( ) {  Sobreposição do método da double area = 0; superclasse area = lado * lado; return area; } } Polimorfismo ©2012 Ludimila Monjardim Casagrande 9
  • 10.
    Exemplo de Polimorfismo public class Circulo extends Figura {  Herança double raio; public Circulo (double raio) { this.raio = raio; } public double calcularArea( ) {  Sobreposição do método da double area = 0; superclasse. area = 3.14 * raio * raio; return area; } } Polimorfismo ©2012 Ludimila Monjardim Casagrande 10
  • 11.
    Exemplo de Polimorfismo public class Principal { public static void main(String[ ] args) { Figura f1 = new Quadrado(4); Figura f2 = new Circulo(2); System.out.println("Área da Figura 1 é: "  Comportamento + f1.calcularArea( ) + "n" polimórfico. + "Área da Figura 2 é: " + f2.calcularArea( )); } Um mesmo tipo base Figura, por meio das variáveis f1 e f2, é utilizado } para enviar uma mesma mensagem calcularArea para objetos de tipos diferentes Quadrado e Circulo e o comportamento executado será distinto. Polimorfismo ©2012 Ludimila Monjardim Casagrande 11
  • 12.
    Exemplo de Polimorfismo public class VetorFiguras { private Figura[] figuras = new Figura[10]; private int totalDeElementos; public double calcularAreaTotal() { double areaTotal = 0; for (int i = 0; i < figuras.length; i++) { if (figuras[i] != null) { areaTotal = areaTotal + figuras[i].calcularArea();  Comportamento } polimórfico. } return areaTotal; } } Polimorfismo ©2012 Ludimila Monjardim Casagrande 12
  • 13.
    Outro Exemplo A fila de impressão FilaImpressao Documento armazena objetos imprime() genéricos do tipo Documento imprime() A mensagem transmitida é: imprima todos os Documentos da fila DocWord DocExcel DocPDF Cada tipo de documento conhece seus detalhes de imprime() imprime() imprime() impressão Polimorfismo ©2012 Ludimila Monjardim Casagrande 13
  • 14.
    Vantagens do Polimorfismo  Já vimos que o grande benefício do polimorfismo é permitir que vários objetos de um mesmo tipo base sejam tratados da mesma maneira.  Uma outra vantagem é permitir aumentar um software de maneira mais controlada, mais localizada. Polimorfismo ©2012 Ludimila Monjardim Casagrande 14
  • 15.
    Vantagens do Polimorfismo  Considere o exemplo da fila de impressão. Se quisermos incrementar o software e permitir que novos tipos de documentos sejam impressos, a classe FilaImpressao não precisa ser alterada.  Somente novas classes precisam ser criadas para implementar os novos tipos de documentos. Assim, o trabalho é menor e mais localizado, evitando que erros de programação sejam inseridos na classe FilaImpressao. Polimorfismo ©2012 Ludimila Monjardim Casagrande 15
  • 16.
    Classes Abstratas  Vimos no exemplo das classes de figuras geométricas, que a classe Figura implementa o método calcularArea, porém o método somente retorna 0 e não realiza nenhum cálculo.  Isso foi feito para que a classe base Figura definisse o comportamento padrão para toda a hierarquia de classes de figuras geométricas, assim todos os objetos das classes derivadas podem ser tratados da mesma maneira (pelo polimorfismo). Polimorfismo ©2012 Ludimila Monjardim Casagrande 16
  • 17.
    Classes Abstratas  Uma outra maneira de implementar o comportamento padrão para toda uma hierarquia de classes é fazendo com que a classe base seja uma classe abstrata.  Uma classe abstrata é uma classe que não pode ser instanciada, isto é, nenhum objeto daquela classe pode ser criado.  Uma classe abstrata serve apenas para definir um comportamento comum que todas as classes derivadas devem seguir. Polimorfismo ©2012 Ludimila Monjardim Casagrande 17
  • 18.
    Classes Abstratas  Para alterar a classe Figura e torná-la abstrata, basta acrescentar a palavra-chave do Java abstract na sua declaração: public abstract class Figura { public double calcularArea( ) { return 0; } } Polimorfismo ©2012 Ludimila Monjardim Casagrande 18
  • 19.
    Classes Abstratas  Desse modo, nenhum objeto da classe Figura pode ser criado e a linha abaixo causará um erro de compilação: Figura f = new Figura( ); Polimorfismo ©2012 Ludimila Monjardim Casagrande 19
  • 20.
    Métodos Abstratos  O Java permite que métodos sejam definidos como abstratos e, portanto, sem nenhuma implementação.  Para criar um método abstrato, usamos a palavra-chave abstract na assinatura do método e omitimos o seu corpo (já que não há implementação): public abstract class Figura { public abstract double calcularArea( ); } Polimorfismo ©2012 Ludimila Monjardim Casagrande 20
  • 21.
    Regras sobre ClassesAbstratas  Toda classe derivada de uma classe abstrata deve obrigatoriamente implementar os métodos abstratos da superclasse, caso contrário, um erro de compilação é gerado.  Uma classe que tenha um ou mais métodos abstratos deve ser obrigatoriamente definida como abstrata, caso contrário um erro de compilação é gerado. Polimorfismo ©2012 Ludimila Monjardim Casagrande 21
  • 22.
    Regras sobre ClassesAbstratas  Uma classe abstrata pode conter métodos não abstratos, isto é, métodos com implementação.  Se esses métodos não abstratos não forem definidos (sobrepostos) nas subclasses, então, quando um objeto da subclasse realizar a chamada a um desses métodos, o código contido na classe abstrata será executado (devido à herança). Polimorfismo ©2012 Ludimila Monjardim Casagrande 22
  • 23.
    Exemplo publicabstract class Figura { public abstract double calcularArea( ); public void imprimeArea( ) { System.out.println(calcularArea( )); } } public class Principal { public static void main(String[] args) { Quadrado q = new Quadrado(4); Circulo c = new Circulo(2); System.out.print("Área da Figura 1 é: "); q.imprimeArea( ); System.out.print("Área da Figura 2 é: "); c.imprimeArea( ); } } Polimorfismo ©2012 Ludimila Monjardim Casagrande 23
  • 24.
    Bibliografia Sugerida  Java: Como programar Autores: H. M. Deitel e P. J. Deitel Editora: Pearson – 6a Edição  Complete Java 2 Certification Study Guide Sybex Polimorfismo ©2012 Ludimila Monjardim Casagrande 24