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