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 1 o, depende de um ou mais n o s anteriores. prog. aritmética: diferença entre 2 termos consecutivos é constante. Exemplo: 1, 3, 5, 7, 9,... Termo geral: a n = d + a n 1, n > 1 ou a n = a 1 + (n 1)d, n > 1 ou a n = a m + (n m)d, n > m onde d = a n a n 1, n > 1 prog. geométrica: razão entre 2 termos consecutivos é constante. Exemplo: 1, 2, 4, 8, 16,... ou 1, 2 1, 2 2, 2 3, 2 4,... Termo geral: an = ar n 1, n > 1 ou recursivamente a n = ra n 1, n > 1. prog. fibonacci: um termo é a soma dos dois termos anteriores, com excepção dos dois primeiros. Exemplo: 0, 1, 1, 2, 3, 5, 8,... Termo geral: an = a n 1 + a n 2, n > 2 e a 1 = 0, a 2 = 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