poo - 10 - herança

23
Composição e Herança Programação Orientada a Objetos Ludimila Monjardim Casagrande 2012 Reutilização de Classes

Upload: ludimila-monjardim-casagrande

Post on 22-Jan-2018

6.019 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: POO - 10 - Herança

Composição e Herança

Programação Orientada a Objetos

Ludimila Monjardim Casagrande 2012

Reutilização de Classes

Page 2: POO - 10 - Herança

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

Page 3: POO - 10 - Herança

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

Page 4: POO - 10 - Herança

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

Page 5: POO - 10 - Herança

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

Page 6: POO - 10 - Herança

Exemplo

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

Page 7: POO - 10 - Herança

Exemplo

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

Page 8: POO - 10 - Herança

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

Page 9: POO - 10 - Herança

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

Page 10: POO - 10 - Herança

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

Page 11: POO - 10 - Herança

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

Page 12: POO - 10 - Herança

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

Page 13: POO - 10 - Herança

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

Page 14: POO - 10 - Herança

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

Page 15: POO - 10 - Herança

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

Exemplo

Page 16: POO - 10 - Herança

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

Page 17: POO - 10 - Herança

Exemplo

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

Page 18: POO - 10 - Herança

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.

Page 19: POO - 10 - Herança

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

Page 20: POO - 10 - Herança

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

Page 21: POO - 10 - Herança

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

Page 22: POO - 10 - Herança

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

Page 23: POO - 10 - Herança

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.