Programação Orientada a Objetos



       Composição e Herança
          Reutilização de Classes



          Ludimila Monjardim Casagrande
                      2012
Reutilização

     Uma das características mais importantes das
        linguagens orientadas a objetos é a capacidade de
        facilitar a reutilização de código – o aproveitamento
        de classes e métodos que já estejam
        implementados e cujo funcionamento já tenha sido
        testado e comprovado.
     Reutilização de código:
           diminui o esforço de implementação;
           facilita a manutenção;
           minimiza a possibilidade de erros.

Composição e Herança       ©2012 Ludimila Monjardim Casagrande   2
Mecanismos de Reutilização

     Existem dois mecanismos básicos de
        reutilização de classes:
           Composição (ou Delegação)
           Herança
     Com composição, usamos uma instância de
        uma classe como campo em outra classe.
     Com herança, criamos uma classe nova como
        uma extensão direta da classe base.


Composição e Herança   ©2012 Ludimila Monjardim Casagrande   3
Composição ou Delegação

     Uma possível forma de reutilizar métodos de
        uma classe base em outra classe é incluindo
        uma instância da classe base como um dos
        atributos da nova classe.

     Para que os métodos da classe base sejam
        executados, escrevemos métodos na classe
        nova que chamam os da classe base,
        delegando dessa forma a execução dos
        métodos.

Composição e Herança   ©2012 Ludimila Monjardim Casagrande   4
Exemplo
  public class DataHora { // declaração da classe
       private Data estaData;     // referência a uma instância da classe Data
       private Hora estaHora;     // referência a uma instância da classe Hora
       public DataHora(int dia, int mes, int ano, int hora, int minuto, int segundo) {
          estaData = new Data(dia, mes, ano);
          estaHora = new Hora(hora, minuto, segundo);
       }
       public DataHora( int dia, int mes, int ano) {
          estaData = new Data(dia, mes, ano);
          estaHora = new Hora();
       }
       public String toString() {
          return estaData + " " + estaHora;
       }
  } // fim da classe DataHora
Composição e Herança            ©2012 Ludimila Monjardim Casagrande                      5
Exemplo




Composição e Herança   ©2012 Ludimila Monjardim Casagrande   6
Exemplo




Composição e Herança   ©2012 Ludimila Monjardim Casagrande   7
Exemplo

     A classe DataHora reutiliza as classes Data e
        Hora através de composição ou delegação.

     A data e hora são representadas por instâncias
        das respectivas classes que estão embutidas na
        classe DataHora, e toda a interação entre esta
        classe e as embutidas é feita por meio da
        chamada de métodos das classes embutidas.




Composição e Herança   ©2012 Ludimila Monjardim Casagrande   8
Exemplo

     O construtor para a classe DataHora, que
        recebe argumentos para inicializar todos os
        campos que esta classe indiretamente contém,
        chama os construtores das classes Data e Hora
        para inicializar os campos das instâncias destas
        classes.




Composição e Herança   ©2012 Ludimila Monjardim Casagrande   9
Composição e Modificadores de Acesso

     Classes que contêm instâncias de outras
        classes estão submetidas às restrições
        impostas pelos modificadores de acesso
        utilizados na classe embutida mais as restrições
        impostas pela própria classe.

     Exemplo:
           Atributos estaData e estaHora na classe
            DataHora.


Composição e Herança     ©2012 Ludimila Monjardim Casagrande   10
Considerações sobre a Composição

     Reutilização de classes via delegação é útil
        quando a classe que reutiliza instâncias de
        outras é composta pelas outras classes.

     No entanto, esse mecanismo não é o mais
        natural quando se trata da criação de classes
        que são especializações de um dado conceito.




Composição e Herança   ©2012 Ludimila Monjardim Casagrande   11
Herança

     O outro mecanismo para reutilização de código
        é a herança, que permite que uma nova classe
        seja criada por meio da extensão de uma já
        existente.

     Na nova classe são implementadas eventuais
        diferenças de comportamento em relação à
        classe base, são adicionados atributos e
        métodos e são reutilizados atributos e métodos
        da classe base.

Composição e Herança   ©2012 Ludimila Monjardim Casagrande   12
Herança

     A herança deve ser utilizada quando se deseja
        especializar uma classe e quando existe a
        relação de “é um” entre a subclasse e a
        superclasse.
     Exemplos:
           Aluno é uma Pessoa
           Professor é uma Pessoa




Composição e Herança    ©2012 Ludimila Monjardim Casagrande   13
Exemplo

     Se estivermos implementando um sistema para
        universidade, podemos pensar em classes
        como Aluno, Professor, Coordenador, Diretor,
        Secretária, etc.

     Todas essas classes são pessoas. Portanto,
        podemos criá-las por meio do processo de
        herança, especializando a classe Pessoa.




Composição e Herança   ©2012 Ludimila Monjardim Casagrande   14
Exemplo




Composição e Herança   ©2012 Ludimila Monjardim Casagrande   15
Exemplo

   A sintaxe para criação de herança em Java é
      simples. Basicamente, dizemos que uma classe
      herda ou “estende” outra, através da palavra-chave
      extends. Assim, definimos a classe Aluno da
      seguinte forma:
         public class Aluno extends Pessoa




Composição e Herança   ©2012 Ludimila Monjardim Casagrande   16
Exemplo




Composição e Herança   ©2012 Ludimila Monjardim Casagrande   17
Considerações sobre o Exemplo

     Desse modo, a classe Aluno foi criada a partir da classe
        Pessoa. Todos os atributos e métodos da classe Pessoa
        foram herdados pela classe Aluno.
     Dizemos que a classe Pessoa é a classe base, ou
        superclasse, ou genérica, ou classe pai, e a classe
        Aluno é a classe especializada, ou subclasse, ou classe
        filha.
     Pode ser usado o relacionamento estabelecido pela
        herança, pelo fato de podermos dizer que um Aluno é
        uma Pessoa.



Composição e Herança     ©2012 Ludimila Monjardim Casagrande      18
Considerações sobre o Exemplo

     Como o objeto da classe Aluno herda os atributos
        /métodos da classe Pessoa, ao criarmos um objeto
        aluno da classe Aluno, o código abaixo seria correto:
          Aluno aluno = new Aluno();
          aluno.setNome(“João”);
          aluno.setCpf(“123456789”);
          ...
          aluno.setMatricula(1234);
     No código podemos ver que os métodos que
        inicialmente foram definidos na classe Pessoa podem
        ser chamados para um objeto da classe Aluno.



Composição e Herança         ©2012 Ludimila Monjardim Casagrande   19
Chamada de Construtor da Classe Pai

    Considerando o exemplo anterior, nas linhas 7 a 12 temos:



    Sabemos que public Aluno... define um construtor para a classe
       Aluno.
    Na linha 9, o uso da palavra-chave super significa uma chamada
       ao construtor da classe Pai (Pessoa). Assim, a classe Aluno
       repassa para a classe Pai os dados que são herdados (nome, cpf,
       rg, endereço), e armazena na própria classe seus dados
       (matrícula e curso).



Composição e Herança      ©2012 Ludimila Monjardim Casagrande         20
Dicas sobre Construtores
   O primeiro comando executado por todo construtor é uma
      chamada para o construtor default da sua superclasse, a
      menos que isso seja explicitamente modificado na sua
      implementação.
   Se você desejar fazer uma chamada para qualquer outro
      construtor, isso deve ser feito logo na primeira linha. Como
      no exemplo abaixo:




Composição e Herança     ©2012 Ludimila Monjardim Casagrande         21
Dicas sobre Construtores
   Um construtor pode chamar outro construtor da própria
      classe (overloaded) pelo uso da palavra-chave this ou
      qualquer construtor de uma das suas superclasses pela
      palavra-chave super. As palavras-chave devem ser
      sucedidas pelos argumentos do construtor de interesse.
   Se você cria um construtor sem a chamada ao this ou
      super, o compilador irá inserir automaticamente uma
      chamada ao super() sem argumentos na primeira linha.
   Não é possível chamar um método de instância (métodos
      não estático) ou acessar uma variável de instância antes
      que o construtor seja executado.


Composição e Herança    ©2012 Ludimila Monjardim Casagrande      22
Leitura Recomendada

     Capítulo 8 – Páginas 113 a 138 do Livro-Texto.
        Introdução à Programação Orientada a Objetos
        Usando Java.




Composição e Herança   ©2012 Ludimila Monjardim Casagrande   23

POO - 10 - Herança

  • 1.
    Programação Orientada aObjetos Composição e Herança Reutilização de Classes Ludimila Monjardim Casagrande 2012
  • 2.
    Reutilização  Uma das características mais importantes das linguagens orientadas a objetos é a capacidade de facilitar a reutilização de código – o aproveitamento de classes e métodos que já estejam implementados e cujo funcionamento já tenha sido testado e comprovado.  Reutilização de código:  diminui o esforço de implementação;  facilita a manutenção;  minimiza a possibilidade de erros. Composição e Herança ©2012 Ludimila Monjardim Casagrande 2
  • 3.
    Mecanismos de Reutilização  Existem dois mecanismos básicos de reutilização de classes:  Composição (ou Delegação)  Herança  Com composição, usamos uma instância de uma classe como campo em outra classe.  Com herança, criamos uma classe nova como uma extensão direta da classe base. Composição e Herança ©2012 Ludimila Monjardim Casagrande 3
  • 4.
    Composição ou Delegação  Uma possível forma de reutilizar métodos de uma classe base em outra classe é incluindo uma instância da classe base como um dos atributos da nova classe.  Para que os métodos da classe base sejam executados, escrevemos métodos na classe nova que chamam os da classe base, delegando dessa forma a execução dos métodos. Composição e Herança ©2012 Ludimila Monjardim Casagrande 4
  • 5.
    Exemplo publicclass DataHora { // declaração da classe private Data estaData; // referência a uma instância da classe Data private Hora estaHora; // referência a uma instância da classe Hora public DataHora(int dia, int mes, int ano, int hora, int minuto, int segundo) { estaData = new Data(dia, mes, ano); estaHora = new Hora(hora, minuto, segundo); } public DataHora( int dia, int mes, int ano) { estaData = new Data(dia, mes, ano); estaHora = new Hora(); } public String toString() { return estaData + " " + estaHora; } } // fim da classe DataHora Composição e Herança ©2012 Ludimila Monjardim Casagrande 5
  • 6.
    Exemplo Composição e Herança ©2012 Ludimila Monjardim Casagrande 6
  • 7.
    Exemplo Composição e Herança ©2012 Ludimila Monjardim Casagrande 7
  • 8.
    Exemplo  A classe DataHora reutiliza as classes Data e Hora através de composição ou delegação.  A data e hora são representadas por instâncias das respectivas classes que estão embutidas na classe DataHora, e toda a interação entre esta classe e as embutidas é feita por meio da chamada de métodos das classes embutidas. Composição e Herança ©2012 Ludimila Monjardim Casagrande 8
  • 9.
    Exemplo  O construtor para a classe DataHora, que recebe argumentos para inicializar todos os campos que esta classe indiretamente contém, chama os construtores das classes Data e Hora para inicializar os campos das instâncias destas classes. Composição e Herança ©2012 Ludimila Monjardim Casagrande 9
  • 10.
    Composição e Modificadoresde Acesso  Classes que contêm instâncias de outras classes estão submetidas às restrições impostas pelos modificadores de acesso utilizados na classe embutida mais as restrições impostas pela própria classe.  Exemplo:  Atributos estaData e estaHora na classe DataHora. Composição e Herança ©2012 Ludimila Monjardim Casagrande 10
  • 11.
    Considerações sobre aComposição  Reutilização de classes via delegação é útil quando a classe que reutiliza instâncias de outras é composta pelas outras classes.  No entanto, esse mecanismo não é o mais natural quando se trata da criação de classes que são especializações de um dado conceito. Composição e Herança ©2012 Ludimila Monjardim Casagrande 11
  • 12.
    Herança  O outro mecanismo para reutilização de código é a herança, que permite que uma nova classe seja criada por meio da extensão de uma já existente.  Na nova classe são implementadas eventuais diferenças de comportamento em relação à classe base, são adicionados atributos e métodos e são reutilizados atributos e métodos da classe base. Composição e Herança ©2012 Ludimila Monjardim Casagrande 12
  • 13.
    Herança  A herança deve ser utilizada quando se deseja especializar uma classe e quando existe a relação de “é um” entre a subclasse e a superclasse.  Exemplos:  Aluno é uma Pessoa  Professor é uma Pessoa Composição e Herança ©2012 Ludimila Monjardim Casagrande 13
  • 14.
    Exemplo  Se estivermos implementando um sistema para universidade, podemos pensar em classes como Aluno, Professor, Coordenador, Diretor, Secretária, etc.  Todas essas classes são pessoas. Portanto, podemos criá-las por meio do processo de herança, especializando a classe Pessoa. Composição e Herança ©2012 Ludimila Monjardim Casagrande 14
  • 15.
    Exemplo Composição e Herança ©2012 Ludimila Monjardim Casagrande 15
  • 16.
    Exemplo A sintaxe para criação de herança em Java é simples. Basicamente, dizemos que uma classe herda ou “estende” outra, através da palavra-chave extends. Assim, definimos a classe Aluno da seguinte forma:  public class Aluno extends Pessoa Composição e Herança ©2012 Ludimila Monjardim Casagrande 16
  • 17.
    Exemplo Composição e Herança ©2012 Ludimila Monjardim Casagrande 17
  • 18.
    Considerações sobre oExemplo  Desse modo, a classe Aluno foi criada a partir da classe Pessoa. Todos os atributos e métodos da classe Pessoa foram herdados pela classe Aluno.  Dizemos que a classe Pessoa é a classe base, ou superclasse, ou genérica, ou classe pai, e a classe Aluno é a classe especializada, ou subclasse, ou classe filha.  Pode ser usado o relacionamento estabelecido pela herança, pelo fato de podermos dizer que um Aluno é uma Pessoa. Composição e Herança ©2012 Ludimila Monjardim Casagrande 18
  • 19.
    Considerações sobre oExemplo  Como o objeto da classe Aluno herda os atributos /métodos da classe Pessoa, ao criarmos um objeto aluno da classe Aluno, o código abaixo seria correto: Aluno aluno = new Aluno(); aluno.setNome(“João”); aluno.setCpf(“123456789”); ... aluno.setMatricula(1234);  No código podemos ver que os métodos que inicialmente foram definidos na classe Pessoa podem ser chamados para um objeto da classe Aluno. Composição e Herança ©2012 Ludimila Monjardim Casagrande 19
  • 20.
    Chamada de Construtorda Classe Pai  Considerando o exemplo anterior, nas linhas 7 a 12 temos:  Sabemos que public Aluno... define um construtor para a classe Aluno.  Na linha 9, o uso da palavra-chave super significa uma chamada ao construtor da classe Pai (Pessoa). Assim, a classe Aluno repassa para a classe Pai os dados que são herdados (nome, cpf, rg, endereço), e armazena na própria classe seus dados (matrícula e curso). Composição e Herança ©2012 Ludimila Monjardim Casagrande 20
  • 21.
    Dicas sobre Construtores  O primeiro comando executado por todo construtor é uma chamada para o construtor default da sua superclasse, a menos que isso seja explicitamente modificado na sua implementação.  Se você desejar fazer uma chamada para qualquer outro construtor, isso deve ser feito logo na primeira linha. Como no exemplo abaixo: Composição e Herança ©2012 Ludimila Monjardim Casagrande 21
  • 22.
    Dicas sobre Construtores  Um construtor pode chamar outro construtor da própria classe (overloaded) pelo uso da palavra-chave this ou qualquer construtor de uma das suas superclasses pela palavra-chave super. As palavras-chave devem ser sucedidas pelos argumentos do construtor de interesse.  Se você cria um construtor sem a chamada ao this ou super, o compilador irá inserir automaticamente uma chamada ao super() sem argumentos na primeira linha.  Não é possível chamar um método de instância (métodos não estático) ou acessar uma variável de instância antes que o construtor seja executado. Composição e Herança ©2012 Ludimila Monjardim Casagrande 22
  • 23.
    Leitura Recomendada  Capítulo 8 – Páginas 113 a 138 do Livro-Texto. Introdução à Programação Orientada a Objetos Usando Java. Composição e Herança ©2012 Ludimila Monjardim Casagrande 23