2. Classes, Objectos, Herança e Polimorfismo
Fernando Silva
DCC-FCUP
Estruturas de Dados
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
1/1
Tipo Abstracto de Dados
Como vimos, a programação orientada aos objectos tem como conceitos
fundamentais:
as classes que representam a estrutura geral para todos os objectos
possíveis que partilham um conjunto comum de características
definidas por atributos e por métodos que intervêm sobre os atributos.
e os objectos que são instâncias particulares de uma classe; os
atributos constituem o estado do objecto.
Uma classe define, na realidade, um tipo abstracto de dados (TAD).
O que é um TAD?
abstracção matemática de uma estrutura de dados,
que especifica o tipo de dados armazenados e
as condições e as operações que podem manipular esses dados.
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
2/1
Princípios da Orientação aos Objectos
Encapsulamento: esconder detalhes internos da implementação de
componentes.
Modularidade: organizar o código por unidades funcionais distintas.
Influencia re-utilização do código.
Uma forma natural de organizar componentes é em hierarquias que
vão desde o mais específico para o mais geral no topo.
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
3/1
Herança e subclasses
Herança é um mecanismo que, partindo de uma hierarquia de classes,
permite a re-utilização de código.
classe-base ou superclasse é a
classe mais geral da hierarquia.
As subclasses especializam ou
extendem ou herdam de uma
superclasse.
A classe T extende a classe S com
novos atributos e métodos.
T herda de S os seus atributos e
métodos.
A localização de um método faz-se, percorrendo a hierarquia de classes
(dynamic dispatching ou binding).
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
4/1
Hierarquia Pessoa-Aluno
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
5/1
Polimorfismo - overriding
Polimorfismo refere-se à capacidade de uma variável que representa um
objecto ou de um método poder tomar diferentes formas. O Java admite
polimorfismo de inclusão:
métodos com o mesmo nome e argumentos
podem estar em classes diferentes da
hierarquia.
(overriding) o mecanismo de execução
assume a sobreposição e executa o método
que encontrar primeiro percorrendo a
hierarquia de baixo para cima.
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
6/1
Polimorfismo - overloading
O Java também admite sobre-carregamento de métodos (overloading),
associado a polimorfismo paramétrico:
podemos ter na mesma classe, ou em
subclasses, vários métodos com o mesmo
nome, desde que tenham assinaturas
diferentes.
a assinatura de um método refere-se ao tipo
de dados que retorna e ao número e tipo de
argumentos que aceita.
Tendo um objecto o da classe T, podemos
fazer o.a(x,y);. O mecanismo de execução
invoca o método definido em U.
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
7/1
Exemplo: Progressões Numéricas
Uma progressão numérica é uma sequência de números onde cada
número, com excepção do 1o , depende de um ou mais no s anteriores.
prog. aritmética: diferença entre 2 termos consecutivos é constante.
I
I
Exemplo: 1, 3, 5, 7, 9, . . .
Termo geral: an = d + an−1 , n > 1 ou an = a1 + (n − 1)d, n > 1 ou
an = am + (n − m)d, n > m onde d = an − an−1 , n > 1
prog. geométrica: razão entre 2 termos consecutivos é constante.
I
I
Exemplo: 1, 2, 4, 8, 16, . . . ou 1, 21 , 22 , 23 , 24 , . . .
Termo geral: an = ar n−1 , n > 1 ou recursivamente an = ran−1 , n > 1.
prog. fibonacci: um termo é a soma dos dois termos anteriores, com
excepção dos dois primeiros.
I
I
Exemplo: 0, 1, 1, 2, 3, 5, 8, . . .
Termo geral: an = an−1 + an−2 , n > 2 e a1 = 0, a2 = 1.
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
8/1
Exemplo de Herança: Progressões Numéricas
Como vimos, para uma progressão é importante conhecer o primeiro
valor e o valor corrente para se poder determinar o próximo termo da
progressão.
Vejamos a definição de uma classe-geral (secção 2.2.3 do Tamassia):
Progression() constructor da classe.
firstValue() re-inicia a sequência
no 1o valor.
nextValue() avança para o valor
seguinte.
printProgression() re-inicia e
escreve os 1os n valores.
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
9/1
Classe Geral Progressão
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
10 / 1
Classe Progressão Aritmética
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
11 / 1
Classe Progressão Geométrica
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
12 / 1
Classe Progressão Fibonacci
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
13 / 1
Classe Principal para Teste Progressão
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
14 / 1
Exemplo de output do teste da classe progressão
Compilando e executando o programa teríamos como resultado:
Progressão aritmética de razão 1 (default):
0 1 2 3 4 5 6 7 8 9
Progressão aritmética de razão 5:
0 5 10 15 20 25 30 35 40 45
Progressão geométrica de razão 2 (default):
1 2 4 8 16 32 64 128 256 512
Progressão geométrica de razão 3:
1 3 9 27 81 243 729 2187 6561 19683
Progressão Fibonacci com valores default:
0 1 1 2 3 5 8 13 21 34
Progressão Fibonacci com valores iniciais 4 e 6:
4 6 10 16 26 42 68 110 178 288
O que acontece se um dos valores iniciais da progressão de Fibonacci for
negativo? E se o número de termos da progressão geométrica for elevado e
a base também for grande?
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
15 / 1
Hierarquia da classe Progression e suas subclasses
Fernando Silva (DCC-FCUP)
2. Classes, Objectos, Herança e Polimorfismo
Estruturas de Dados
16 / 1
Download

2. Classes, Objectos, Herança e Polimorfismo