Prévia do material em texto
Classes abstratas e interfaces APRESENTAÇÃO As classes abstratas e as interfaces são responsáveis por fazer abstrações, em outras palavras, elas realizam implementação interna de recursos e mostram apenas a funcionalidade aos usuários. Ambas trabalham com o conceito de abstração, no entanto, elas têm suas diferenças. Em Java, a principal diferença entre elas é que os métodos de uma interface Java são implicitamente abstratos e não podem ter implementações; já uma classe abstrata Java pode ter métodos de instância que implementam um comportamento padrão. As classes abstratas podem ter métodos abstratos e não abstratos, diferentemente da interface que contém apenas métodos abstratos. Os métodos abstratos são métodos com assinatura válida, no entanto, eles devem ser sobrescritos e implementados na classe concreta que estende a classe abstrata. Nesta Unidade de aprendizagem, você aprenderá as definições de classes e de métodos abstratos em orientação a objetos, analisar o uso de interfaces, além de aprender como criar uma aplicação utilizando interfaces e classes abstratas. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Identificar o que são classe abstrata e método abstrato.• Analisar casos de utilização de herança e de implementação de interface.• Construir uma aplicação usando classes abstratas e interfaces.• DESAFIO Sistemas computacionais que exigem reaproveitamento de código, geralmente, são projetados para facilitar a sua manutenção. Para isso, é utilizado, com muita frequência, o conceito de herança e polimorfismo. Atrelados ao uso desses conceitos, podem ser utilizadas classes genéricas que nunca serão instanciadas (abstratas), ou até mesmo a implementação de métodos alheios a contratos (interface). Você, como programador de linguagem Java, é convidado para desenvolver um sistema para uma banca de jornal, cujo proprietário deseja expandir seus negócios para o meio digital. Ele quer algo simples, uma vez que o negócio recém foi estabelecido. A banca tem apenas livros (que pode ser classe abstrata) e revistas, os quais implementam o produto dessa banca. O produto será adicionado como interface para que livros e revistam tenham, futuramente, um sistema de desconto. Os livros por sua vez, podem ser ampliados para livro físico, e-book e minilivro. Assim, escreva o código de implementação para esse novo sistema. Para ajudar você em sua programação e guiá-lo no seu passo inicial, veja a modelagem em UML. INFOGRÁFICO Uma classe abstrata permite criar funcionalidades que as subclasses podem implementar ou substituir, enquanto uma interface permite apenas indicar a funcionalidade, mas não implementá-la. Uma classe pode estender apenas uma classe abstrata, enquanto uma classe pode implementar várias interfaces. No Infográfico a seguir, conheça as principais diferenças entre classes abstratas e interfaces. CONTEÚDO DO LIVRO Em se tratando de reaproveitamento de código e de delegação de ações, métodos abstratos e interfaces podem parecer semelhantes em seus comportamentos, contudo, cada um carrega consigo sua particularidade, considerando sempre o contexto e sua aplicabilidade. Na obra Programação orientada a objetos, base teórica desta Unidade de Aprendizagem, leia o capítulo Classes abstratas e interfaces, no qual você irá ver conceitos e aplicações dessas duas características enraizadas na linguagem de programação Java, podendo, ao final, diferenciar uma da outra. Boa leitura. PROGRAMAÇÃO ORIENTADA A OBJETOS Rafael Albuquerque Classes abstratas e interfaces Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: Identificar o que é classe abstrata e método abstrato. Analisar casos de utilização de herança e de implementação de interface. Construir uma aplicação usando classes abstratas e interfaces. Introdução Dentro do paradigma de programação orientada a objetos, classes abs- tratas e interfaces são dois conceitos importantes, pois são responsáveis por determinar comportamentos. Apesar de ambas trabalharem com o conceito de abstração, elas possuem suas particularidades. A principal diferença entre elas é que os métodos de uma interface Java são impli- citamente abstratos, não podendo conter implementação de métodos em sua classe. Já uma classe abstrata em Java pode ter métodos com sua codificação, que implementam um comportamento padrão. Além dos conceitos de classes abstratas e interfaces, existe o con- ceito de métodos abstratos, que podem ser utilizados em interfaces e em classes abstratas, uma vez que um método abstrato possui apenas a assinatura e sua implementação é realizada apenas nas classes que implementem a classe abstrata ou a interface. No entanto, as classes abstratas podem ter tanto os métodos abstratos quanto os não abstratos, diferentemente da interface, que pode possuir apenas métodos abstratos. Neste capítulo, você estudará sobre os conceitos de classes e mé- todos abstratos. Além disso, verá quando utilizar os conceitos de he- rança ou interface. Por fim, verá um exemplo de aplicação prática da implantação de classes abstratas e interfaces, utilizando a linguagem de programação Java. 1 Classes e métodos abstratos Na programação orientada a objetos, existe o conceito de classes, que ge- ralmente têm referência a alguma abstração do mundo real, como pessoas, automóveis, animais. Por meio desse paradigma, é possível criar esse tipo de representação. Em relação à herança, existem as superclasses e as subclasses, bem como dois outros modos de classifi cação, denominados classes abstratas e classes concretas (CARVALHO, 2016). Uma classe concreta é uma classe comum que pode ser instanciada, ao contrário de uma classe abstrata, que não pode ser instanciada, devendo ser estendida. Em geral, uma classe abstrata pode conter métodos abstratos, ou métodos que não são implementados. Esses métodos possuem assinatura válida, porém devem ser sobrescritos e implementados na classe concreta que estende a classe abstrata (FINEGAN; LIGUORI, 2018). As classes abstratas podem estender outras classes abstratas sem implementar seus métodos, além de ter variáveis de instância, as quais podem ser usadas pelas classes concretas que as estendem. As classes abstratas são criadas para representar, de forma genérica, uma família de classes, ou seja, elas servem de molde para outras classes. Assim como as classes, os métodos contidos nelas podem ser concretos — possuem implementação ou são abstratos — contendo apenas sua declaração, que possui apenas as definições de sua assinatura. Por exemplo, considere as formas geométricas triângulo, quadrado e círculo, que fazem parte de uma família de objetos, a qual pode ser chamada de FormaGeometrica. Toda forma geométrica pode ser representada graficamente e pode ter sua área e seu perímetro calculados a partir de suas medidas. No entanto, cada uma delas possui suas próprias fórmulas para os cálculos de perímetro e área. Dessa forma, as formas geométricas podem utilizar o método desenhar, herdado da superclasse FormaGeometrica, mas devem fornecer soluções próprias para os cálculos de área e perímetro. A Figura 1, a seguir, apresenta a implementação da classe abstrata For- maGeometrica, que contém dois métodos abstratos, calcularArea e calculaPerimetro. Classes abstratas e interfaces2 Figura 1. Código Java da classe abstrata FormaGeometrica. Fonte: Machado, Franco e Bertagnolli. (2016, p. 22). A Figura 2, a seguir, apresenta a classe concreta Quadrado, que estende a classe abstrata FormaGeometrica. Os métodos abstratos da classe foram sobrescritos e implementados na classe Quadrado, e esse mesmo procedi- mento deve ser realizado para as demais classes que representam outras formas geométricas, com, por exemplo, um triângulo, ou um círculo entre outras formas geométricas, pois cada forma geométricatem sua própria fórmula para calcular área e perímetro. Figura 2. Código Java da classe Quadrado, definida como uma especialização de FormaGeometrica. Fonte: Machado, Franco e Bertagnolli (2016, p. 22). 3Classes abstratas e interfaces Se você declarar um método abstrato, precisará tornar a classe abstrata também, visto que não é possível ter métodos abstratos em uma classe que não é abstrata. Além disso, toda classe-filha (subclasse) precisa implementar os métodos abstratos da classe-pai (superclasse), a não ser que ela também seja abstrata. 2 Utilização de heranças e interfaces Na orientação a objetos, em algumas situações, é útil defi nir o que uma classe deve fazer, porém não se deve determinar como ela o fará. Conforme Schildt (2014), ao contrário de métodos abstratos, em que método defi ne uma assinatura com seu comportamento-padrão implementado, as interfaces não defi nem a implementação. Em Java, pode-se separar a interface de uma classe de sua implementação usando a palavra-chave interface. Uma interface se assemelha a uma classe abstrata, por não possuir nenhum conteúdo dentro da declaração de suas ações/funções. Logo, uma subclasse de uma interface deve implementar o corpo, estabelecendo, assim, seus com- portamentos. Portanto, pode-se chegar à seguinte conclusão: uma interface especifica o que deve ser feito, mas não como deve ser feito. Após a definição de uma interface, inúmeras classes podem implementá-la, e uma classe pode implementar qualquer número de interfaces. Usando herança e implementação de interfaces No caso de utilização de classes por meio de herança, pode-se defi nir uma classe de maneira especializada. Logo, as subclasses herdam os atributos e as operações das superclasses. Assim, conforme apresentado na Figura 3, a classe Carnivoro possuirá o atributo peso e as operações comer e reproduzir, além daqueles que são específi cos da própria subclasse. Classes abstratas e interfaces4 Figura 3. Hierarquia de classes. Fonte: Machado, Franco e Bertagnolli (2016, p. 18). Utilizando herança, existem casos em que uma classe-filha precisa utilizar algum método da classe-mãe, porém com algumas características distintas. Nesse caso, será preciso sobrecarregar o método. O exemplo da Figura 4 aborda exatamente esse conceito. Observe que, para esse exemplo, existe uma chamada na classe LampadaNatal para a função acender. Mas por que há essa chamada, se na classe-mãe Lampada já existe uma função com o mesmo nome? Para esse caso, é realizada outra ação para o mesmo comportamento de acender, porém com dois argumentos, indicando os tempos de pisca e a duração da iluminação. 5Classes abstratas e interfaces Figura 4. Sobrecarga de métodos em herança. Fonte: Adaptada de Machado, Franco e Bertagnolli (2016). A Figura 5, a seguir, apresenta todas as chamadas da classe. Observe que são feitas duas chamadas à função acender(). A primeira chamada refere- -se à ação realizada na classe superior, que contém apenas duas ações em seu corpo — ativa o atributo TestaLigada e chama a função iluminar(), por não conter nenhum argumento. Já na segunda chamada, são passados como argumento dois valores, e a função acender()está localizada na subclasse LampadaNatal. Figura 5. Exemplo de uso dos métodos herdados e do método sobreposto. Fonte: Machado, Franco e Bertagnolli (2016, p. 19). Um dos inconvenientes em se utilizar classes como herança em Java, mesmo que a classe superior seja concreta ou abstrata, é a não permissão de heranças Classes abstratas e interfaces6 múltiplas. Ou seja, uma classe Veículo nunca poderá ser uma moto ou um carro ao mesmo tempo. Uma maneira de contornar essa situação é por meio do recurso de interface. Segundo Machado, Franco e Bertagnolli (2016), interface é a definição de um contrato, ou seja, seus métodos devem, necessariamente, ser implementados. Uma vez que uma classe implemente essa interface, essa implementação é realizada por meio da sintaxe implements em Java. Apenas as assinaturas dos métodos estão disponíveis, deixando para a classe que o implemento deve prover o com- portamento ou ação necessária. Por padrão, todos os métodos devem ser públicos e abstratos — logo, em sua declaração, nenhuma implementação é permitida. Uma boa maneira de analisar o funcionamento de uma interface, além do método da prática em si, é por meio da linguagem de modelagem unificada (UML). No exemplo da Figura 6, a interface Forca representa uma família de classes (tanto Motor quanto Turbina estão associadas por uma agre- gação a um tipo de Forca) e permite que o veículo tenha o seu núcleo de força alterado (como potência, empuxo, nível de ruído) sem a necessidade de alterações na classe Carro. Figura 6. Representação do uso de interfaces por diagramação de classes. Fonte: Adaptado de Machado, Franco e Bertagnolli (2016). Levando em consideração que existe uma implementação da interface Forca pelas classes de Motor e Turbina, e não uma extensão, isso permite 7Classes abstratas e interfaces que outras interfaces sejam adicionadas ao sistema, como, por exemplo, a interface Direcao, que pode ser implementada para classes como Manual, SemiAutomática, Automatica, ou até mesmo, em um futuro não tão distante, Autonoma, em que cada tipo de direção possui uma forma de ope- ração diferente. Ainda com base nesse exemplo, a implementação da UML da Figura 6 pode ser acompanhada na Figura 7. Figura 7. Codificação da UML apresentada. Fonte: Adaptado de Machado, Franco e Bertagnolli (2016). Observe que o carro aceita como novo núcleo qualquer classe que realize a implementação da interface Forca. Assim, se, no futuro, os carros forem movidos por um novo tipo de moto, como um reator, basta criar: public class Reator implements Forca. Embora as interfaces sejam utilizadas para criar situações de herança múltipla, essa não é a sua finalidade. Essa função é dada a classes abstratas, que conseguem criar uma hierarquia de classes e de subtipos. Contudo, não é considerado um erro utilizar interfaces para simular uma herança. Classes abstratas e interfaces8 3 Aplicação com classes abstratas e interfaces Para o exemplo dado anteriormente, ilustrado pela UML da Figura 6, acrescenta- remos novos tipos de transportes, como Carro e Motocicleta, com o intuito de apresentar o uso das características de classes abstratas aliadas a interfaces. Para tanto, adicionaremos a esse contexto uma classe genérica para representar esses meios de transportes, denominada Veículo, que será responsável por comportamentos comuns, como determinar a forca, ligar e desligar. Na Figura 8, a seguir, é possível acompanhar a implementação da classe- -mãe. Observe que, embora a classe esteja em modo abstrato, é possível de- terminar o seu comportamento sem fazer com que ela se estenda ou tenha que, necessariamente, assinar um contrato, como é feito nas implementações de interface. Além disso, atributos comuns, como ano e placa, assim como métodos comuns de ligar e desligar, ficarão por conta dessa classe genérica. Figura 8. Classe abstrata Veículo. 9Classes abstratas e interfaces Com a classe Veículo criada, é possível incorporar suas subclasses ao programa. Nesse caso, criaremos uma classe chamada Carro, que determinará a marca e o modelo da instância da classe (Figura 9). Figura 9. Subclasse Carro e Teste. Para acompanhar o desempenho das classes adicionadas a essa aplicação, a Figura 10 apresenta o teste de execução e o seu resultado. Figura 10. Teste de execução e resultado. Classes abstratas e interfaces10 Nessa pequena aplicação, criamos apenas uma subclasse de Veículo, denominada de Carro. No entanto, nada impede que sejam acrescentados novos tipo de veículo à estrutura. Para Turbina, acrescentaremos um tipo de campo enum, chamado de TipoTurbina, para facilitar a chamada a tipos variados de turbina nesse exemplo hipotético, os quais são declarados de forma estática. A Figura 11, a seguir, apresenta essaimplementação. Figura 11. Subclasse Carro e Teste. CARVALHO, T. L. Orientação a objetos: aprenda seus conceitos e suas aplicabilidades de forma efetiva. São Paulo: Casa do Código, 2016. FINEGAN, E.; LIGUORI, R. OCA Java SE 8: guia de estudos para o exame 1Z0-808. 3. ed. Porto Alegre: Bookman, 2018. MACHADO, R. P.; FRANCO, M. H. I.; BERTAGNOLLI, S. de C. Desenvolvimento de software III: programação de sistemas web orientada a objetos em Java. Porto Alegre: Book- man, 2016. SCHILDT, H. Java para iniciantes. 6. ed. Porto Alegre: Bookman, 2014. 11Classes abstratas e interfaces DICA DO PROFESSOR Abstract factory é um padrão de design que fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. Uma fábrica abstrata é uma classe que fornece uma interface para produzir uma família de objetos. Em Java, esse padrão pode ser implementado usando-se uma interface ou uma classe abstrata. Nesta Dica do Professor, você vai entender o abstract factory. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Normalmente, em programação orientada a objetos, utiliza-se o conceito de que uma classe pode receber atributos e métodos de uma classe denominada superclasse. Qual o nome dessa característica? A) Característica polimórfica. B) Característica de uma interface. C) Característica de herança. D) Característica de uma implementação. E) Característica de uma abstração. 2) Normalmente, uma classe declarada como genérica, não tem um objeto com sua instância e, por conta disso, algumas situações exigem que sua declaração seja abstrata. Avalie as seguintes sentenças e marque a alternativa correta. A) Toda classe abstrata servirá apenas de modelo. Logo, seus métodos deverão ser sobrescritos, mesmo que tenham sua implementação. B) Uma classe abstrata servirá de modelo para outras classes. Seus métodos devem ser concretos, exigindo sua implementação, contendo, assim, as definições de sua assinatura. C) Uma classe abstrata servirá de modelo para outras classes. Seus métodos devem ser abstratos, ma são implementados na classe abstrata e têm definições de sua assinatura. D) Uma classe abstrata servirá de modelo para outras classes. Seus métodos podem ser abstratos e concretos, no entanto, eles não são implementados na classe abstrata, mas têm definições de sua assinatura. E) Toda classe abstrata servirá apenas de modelo. Logo, seus métodos deverão ser sobrescritos quando declarados como abstract, mesmo que tenham sua implementação. 3) Há situações em que não é desejável que certas classes tenham os mesmos privilégios que outras, como em um sistema bancário. Embora o cliente e o gerente herdem um método para login, os dois não estão no mesmo nível hierárquico, mesmo que ambos herdem a mesma característica de uma superclasse denominada pessoa. Para contornar essa situação e fazer com que cada um tenha sua própria tela de login, assinale a alternativa que mostra o melhor caminho. A) Para que o usuário (cliente) faça login, de forma diferente do gerente e de outros tipos de usuários, é possível estender uma interface chamada login e implementar sua própria função de acesso, sem sobrescrever qualquer método. Para que o usuário (cliente) faça login, de forma diferente do gerente e de outros tipos de B) usuários, ele deve estender uma classe abstrata, herdando assim sua implementação de acesso. C) Para que o usuário (cliente) faça login, de forma diferente do gerente e de outros tipos de usuários, é possível implementar uma interface chamada login e programar sua própria função de acesso, sem sobrescrever qualquer método. D) Para que o usuário (cliente) faça login, de forma diferente do gerente e de outros tipos de usuários, é possível implementar uma interface chamada login para incorporar a programação do método de acesso da interface, tornando-a independente da forma de implementação de sua superclasse. E) Para que o usuário (cliente) faça login, de forma diferente do gerente e de outros tipos de usuários, é possível programar uma interface chamada login para implementar sua própria forma de acesso, tornando-a independente da forma de implementação de sua superclasse. 4) Um método abstrato tem apenas a assinatura e sua implementação e é realizado apenas em classes que implementam a classe abstrata ou a interface. Considerando as propriedades das classes abstratas, qual a saída do seguinte programa? Conteúdo interativo disponível na plataforma de ensino! A) Erro de compilação. B) 2. C) 4. D) 10. E) 20. 5) Mesmo que as classes abstratas sejam parecidas com as interfaces, ambas têm particularidades que as tornam únicas. Logo, marque a resposta que melhor representa cada uma delas. A) Interfaces podem ter apenas métodos abstratos públicos; as classes abstratas não podem conter campos de dados. B) Na classe abstrata, a palavra-chave abstract é opcional para declarar um método. Enquanto na interface, a palavra-chave abstract é obrigatória para declarar um método como um resumo. C) Tanto as interfaces como as classes abstratas podem conter métodos concretos. D) Interface é utilizada quando implementações compartilham apenas a assinatura do método; classe abstrata é usada quando várias implementações do mesmo tipo compartilham um comportamento comum. E) Interface é utilizada quando várias implementações do mesmo tipo compartilham um comportamento comum; classe abstrata é usada quando implementações compartilham apenas a assinatura do método. NA PRÁTICA O conceito de abstração tem papel fundamental para tratar de generalizações de classes em relação aos métodos. Existem os conceitos de classes abstratas e de interfaces que são os responsáveis por realizar abstrações de dados. Neste Na Prática, veja um exemplo de aplicação dos conceitos de interface e de classes abstratas no desenvolvimento de um editor de cena. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Android Interface Definition Language (AIDL) O método final não pode ser substituído, assim, uma função abstrata não pode ser final. O sistema Android Interface Definition Language permite definir a interface de programação que o cliente e o serviço usam para se comunicar entre si, a partir da comunicação entre processos (IPC). No Android, um processo normalmente não pode acessar a memória de outro. Conteúdo interativo disponível na plataforma de ensino! Qual a diferença entre classe interna, classe aninhada e classe anônima? Conteúdo interativo disponível na plataforma de ensino! Java Interface: Aprenda a usar corretamente Conteúdo interativo disponível na plataforma de ensino!