Baixe o app para aproveitar ainda mais
Prévia do material em texto
POO Slides 15 – Polimorfismo Universidade Federal do Ceará Prof. Marcos Antonio de Oliveira Quixadá-CE, 22/11/2010 Sistema de Instrumentos • Imagine o sistema a seguir: Sistema de Instrumentos • Podemos fazer alguma observações sobre este sistema: – Um violão é um instrumento, portanto violão herda de Instrumento; – Um saxofone é um instrumento, portanto saxofone herda de Instrumento; – Uma flauta é um instrumento, portanto o flauta herda de Instrumento; – O método tocar é um método que foi definido em Instrumento e sobrescrito em cada classe filha (Violão, Saxofone e Flauta). Sistema de instrumentos • A classe música (Ou banda como queira chamar) faz uma agregação dos instrumentos; • Uma banda tem um instrumento, tem um violão, tem um saxofone, tem uma flauta; Implementação do sistema Implementação do sistema • Até o momento para instanciarmos nossos objetos fazíamos o seguinte: Instrumento i = new Instrumento(); Violao v = new Violao(); Flauta f = new Flauta(); Saxofone s = new Saxofone(); • Ou seja, a referência apontava sempre para um objeto do mesmo tipo. Ligação precoce • Neste caso quando acessamos o método sobrescrito tocar, fazemos da seguinte maneira: • Em tempo de compilação sabemos que a chamada ao método tocar da linha 6 executará de acordo com o código definido em instrumento; • Isto é conhecido como ligação precoce, pois em tempo de compilação o compilador já liga a chamada do método ao código que vai executar, ou seja, ele sabe que método irá executar em tempo de compilação; Ligação tardia • Em java podemos Criar uma referência do tipo de uma classe pai e fazê-la referenciar um objeto de uma de suas classes filha; • Um exemplo segue abaixo: Instrumento i = new Flauta(); • Observe: – A referência deve ser definida a partir da classe pai, neste caso a classe instrumento é a classe pai como mostrado anteriormente; – O objeto criado com o new é de qualquer uma das classes filhas, neste caso a classe Flauta foi utilizada; Ligação tardia Flauta tocar(String nota) teste() i Ligação tardia • Neste caso o método tocar será executado de acordo com a classe Flauta; • Isto pode ficar transparente para nós, mas o compilador faz esta ligação apenas em tempo de execução; • Como a ligação entre a chamada do método e o código que ele irá executar é feita apenas em tempo de execução, este processo é conhecido como ligação tardia; Ligação tardia • Neste caso podemos acessar apenas os métodos que foram definidos na classe pai; • Se formos acessar o método teste, por exemplo, vai dar erro! i.teste(); • Teste é um método que foi definido em Flauta e que a classe Instrumento não possui; Conceitos de polimorfismo • Polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma identificação (assinatura) mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse. • Possibilidade dos objetos de comportarem-se de maneiras diferentes, de acordo com a sua implementação, ao receber uma mesma mensagem. Conceitos de polimorfismo • Em particular, o polimorfismo permite escrever programas que processam objetos que compartilham a mesma superclasse em uma hierarquia de classes como se todas fossem objetos da superclasse. (Deitel) • Para os exemplos a seguir considere as classes Instrumento, Violao, Flauta e Saxofone que foram apresentadas anteriormente; Exemplos de polimorfismo Exemplos de polimorfismo Polimorfismo • Que método tocar será chamado na linha 26 da classe música? • R – Não podemos afirmar isto em tempo de compilação, ele poderá ser executado de VÁRIAS FORMAS. Poderemos definir a execução apenas em tempo de execução. • O método tocar está sendo executado polimorficamente nas classes Musica e Musica2; Exercício • Crie um programa com as classes Figura, Retangulo, Circulo e Quadrado. • Essas classes devem ter o método desenhar() que imprimirá uma mensagem informando que a figura está sendo desenhada. • O método desenhar deve ser redefinido nas subclasses de figura. • Crie uma classe Principal para imprimir figuras utilizando polimorfismo! • Realize a escolha de que Figura será instanciada em tempo de execução. 31/05/17 17 Prof. Marcos Antonio de Oliveira
Compartilhar