poo - 10 - herança
TRANSCRIPT
Composição e Herança
Programação Orientada a Objetos
Ludimila Monjardim Casagrande 2012
Reutilização de Classes
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
Composição e Herança ©2012 Ludimila Monjardim Casagrande 5
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
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
Composição e Herança ©2012 Ludimila Monjardim Casagrande 15
Exemplo
Composição e Herança ©2012 Ludimila Monjardim Casagrande 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
Exemplo
Composição e Herança ©2012 Ludimila Monjardim Casagrande 17
Composição e Herança ©2012 Ludimila Monjardim Casagrande 18
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.
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
Composição e Herança ©2012 Ludimila Monjardim Casagrande 20
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).
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
Composição e Herança ©2012 Ludimila Monjardim Casagrande 23
Leitura Recomendada
Capítulo 8 – Páginas 113 a 138 do Livro-Texto.
Introdução à Programação Orientada a Objetos
Usando Java.