Você está na página 1de 6

10.

Classes Abstratas e Concretas


Neste capítulo são apresentados os conceitos de classes concretas, classes
abstratas e métodos abstratas, com um exemplo de sua aplicação.
Ao final deste capítulo o estudante deverá ser capaz de projetar e definir
hierarquias de classes usando classes abstratas.
10.1. Classes Concretas
No estudo de caso da biblioteca, apresentado no capítulo 9, definimos as classes Livro e
Periodico englobando, respectivamente, os livros comuns e os exemplares de revistas e
jornais que pertencem ao acervo da biblioteca. Como, do ponto de vista da biblioteca, um
periódico pode ser visto como uma especialização de um livro comum, a classe Periodico
foi definida como subclasse de Livro. Na figura 10.1 está representada a hierarquia de
classes obtida e a instanciação de dois objetos: um livro e um periódico.

Fig. 10.1 - Hierarquia de Classes Livro - Periódico


Classes como Livro e Periodico, que podem ser instanciadas diretamente, são ditas
classes concretas.
Classe concreta (concrete class) É uma classe que pode ser instanciada diretamente.
A classe Periodico, como definida na seção 9.6.5, utiliza plenamente a implementação
herdada da classe Livro. O método empresta(), que é seu único método especializado,
apenas acrescenta uma restrição ao método correspondente da classe Livro, que continua
sendo chamado através do comando super.empresta(). Temos, nesse caso, um uso
correto de redefinição de método entre duas classes concretas da aplicação.
10.2. Conceito de Classe Abstrata
Uma outra abordagem para a modelagem das classes daquele estudo de caso da biblioteca,
apresentado no Capítulo 9, é considerarmos as classes Livro e Periodico como
especializações de uma classe Exemplar, que abranja todos os exemplares da biblioteca,
como na figura 10.2.

Copyright © 2003, Cecília Rubira. Todos os direitos reservados.


100 Cap. 10 / Classes Abstratas e Concretas

Exemplar

+ bloqueia()
+ desbloqueia()
+ empresta()
+ devolve()

Periódico
Livro

+ empresta()

Curso de PC Magazine
Java

Fig. 10.2 - Hierarquia de Classes de Exemplares da Biblioteca


Classe abstrata (abstract class) É uma classe que não pode ser instanciada diretamente.
Para ilustrar a aplicação de classes abstratas, vamos supor que a biblioteca passe a manter
fitas de vídeo em seu acervo, para as quais são previstas operações de empréstimo de
acordo com as seguintes regras específicas:
(i) a cada fita é associado um nível de privilégio, que determina que tipos de usuários
podem retirá-la, podendo ser: apenas professores; alunos ou professores ou qualquer
usuário;
(ii) o nível de privilégio de uma fita pode ser alterado a qualquer momento;
(iii) o prazo de empréstimo de uma fita é sempre de dois dias;
(iv) as fitas não podem ser bloqueadas/desbloqueadas.
Podemos, portanto, definir um tipo abstrato de dados para as fitas através das operações:
empréstimo, retorno e alteração de nível de privilégio. Para implementar esse tipo abstrato
de dados iremos definir a classe Fita. A questão a ser decidida é se devemos incluir essa
nova classe na hierarquia de classes existente, e como isso deve ser feito.
Comparando os tipos abstratos de dados 'fitas' e 'livros', verificamos que as diferenças entre
ambos não permite estabelecer uma verdadeira relação de generalização / especialização
entre esses dois tipos. Considerar as fitas como uma especialização de livros implica em
incluir as operações de bloqueio e desbloqueio no comportamento das fitas. De modo
inverso, considerar os livros como uma especialização de fitas implica em incluir a operação
de alteração do nível de privilégio no comportamento dos livros.
Pelo exposto acima, uma relação de herança entre as classes Livro (ou Periodico) e
Fita, em qualquer sentido, não seria recomendada, pois alteraria a definição de algum tipo
abstrato de dados.
Por outro lado, as operações de empréstimo e retorno são comuns aos dois tipos, podendo
ser vantajoso para a aplicação trata-los como um único tipo, ao menos sob esses aspectos.

Copyright © 2003, Cecília Rubira. Todos os direitos reservados.


Cap. 10 / Classes Abstratas 101

As classes abstratas nos fornecem uma solução adequada para situações como essa.
Podemos criar uma classe abstrata Item, englobando todos os itens do acervo da
biblioteca, como superclasse de Livro e Fita, como representado na figura 9.2.
Note que a única função da classe Item é servir como superclasse, não podendo existir na
aplicação objetos instanciados diretamente dela. Sendo assim, podemos omitir de sua
implementação tudo o que for específico de suas subclasses, e nos restringir apenas às
estruturas de dados e métodos que serão de fato herdados tanto pela classe Livro como
Fita.
10.3. Métodos Abstratos
Analisando mais detalhadamente a operação de empréstimo, como definida para os tipos
abstratos de dados 'livros' e 'fitas', observamos as seguintes diferenças:
(i) para que um livro possa ser emprestado, basta que ele esteja disponível. Para uma
fita, é necessário também que o usuário que a solicita seja de um tipo compatível com
o seu nível de privilégio;
(ii) para que uma fita seja considerada disponível, basta que ela não esteja emprestada.
Para um livro, é necessário também que não esteja bloqueado.
Isso significa que, embora a operação de empréstimo seja comum aos dois tipos, as classes
Livro e Fita deverão definir diferentes implementações para essa operação. Note que não
é possível definir uma dessas duas formas de implementação como uma simples extensão
da outra: para uma fita não há sentido em se falar em "não estar bloqueada", assim como
para um livro não há sentido em se falar em "nível de privilégio".
Não podemos, portanto, incluir na definição da classe Item nenhuma dessas duas
implementações possíveis para a operação de empréstimo. O que fazemos em situações
como essa é definir uma operação empréstimo mais abstrata, que possa ser estendida pelas
classes Livro e Fita, e implementar essa operação na classe abstrata Item, como
apresentado na Fig. 10.3.
Considere, por exemplo, a implementação da operação de empréstimo na classe Livro, tal
como definida na seção 9.6.4. O método empresta(), que executa a operação, utiliza o
método isDisponivel() para verificar se o livro está disponível. É o método
isDisponivel(), portanto, que se preocupa com a condição "bloqueado", específica dos
livros. Observe que o método empresta() poderia ser utilizado também para o caso das
fitas se deixássemos a implementação do método isDisponivel() em aberto, ou seja,
como um método abstrato.
Método abstrato (abstract method) É um método para o qual não é definida uma forma
de implementação específica.
Podemos, então, incluir aquela implementação do método empresta() na classe Item,
definindo o método isDisponivel() como abstrato. Cada uma das classes Livro e Fita
deve fornecer a sua implementação específica para o método isDisponivel(). Caberá à
classe Fita estender o método empresta() para condicionar o empréstimo ao tipo do
usuário e nível de privilégio da fita.
102 Cap. 10 / Classes Abstratas e Concretas

Fig. 10.3 - Hierarquia Item

10.4. Definição da Classe Abstrata Item


Uma classe abstrata é definida de forma semelhante a uma classe concreta, porém com o
modificador abstract na cláusula class. Os métodos abstratos também são definidos
com o modificador abstract e não podem ter nenhuma implementação. Qualquer classe
que contenha ao menos um método abstrato é considerada abstrata, mesmo que não seja
declarada como abstract.
O código seguinte define a classe abstrata Item, tal como especificada na seção anterior.
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Date;
abstract class Item { // classe abstrata
private String titulo;
private Usuario retiradoPor;
private Date dtEmprestimo;
private Date dtDevolucao;
public Item (String tit) {
titulo=tit;
}
public boolean isEmprestado() {
return (!(retiradoPor==null));
}
public boolean isEmAtraso() {
Date hoje=new Date();
return(isEmprestado()&&
dtDevolucao.before(hoje));
}

Copyright © 2003, Cecília Rubira. Todos os direitos reservados.


Cap. 10 / Classes Abstratas 103

// o metodo abaixo e' abstrato


abstract public boolean isDisponivel();
public boolean empresta (Usuario u, int prazo) {
GregorianCalendar cal=new GregorianCalendar();
if (isDisponivel()) {
retiradoPor=u;
dtEmprestimo=cal.getTime();
cal.add(Calendar.DATE, prazo);
dtDevolucao=cal.getTime();
return(true);
}
else return(false);
}
public boolean retorna (Usuario u) {
if (u==retiradoPor) {
retiradoPor=null;
return(true);
}
else return (false);
}
}
Toda subclasse de uma classe abstrata precisa fornecer uma implementação para os
métodos abstratos da superclasse, ou então declará-los também como abstratos. Nesse
último caso a subclasse será também abstrata. Deixamos como exercício para o estudante
alterar a definição da classe Livro, definida na seção 9.6.4, para torná-la uma subclasse de
Item.
10.5. Usos Corretos de Classes Abstratas
A definição de classes abstratas permite, como vimos, a definição de hierarquias de classes
mais complexas. Seu uso indiscriminado pode, porém, criar "famílias" de objetos que não
possuem vínculos fortes entre si, tornando-se um obstáculo à sua utilização e manutenção
futuras. Os mecanismos de herança em orientação a objetos são como heranças na vida
real: tanto podem nos trazer grandes benefícios como se tornar uma fonte de complicações
e problemas! O exemplo seguinte ilustra esse tipo de problema.
Suponha que se resolva ampliar os serviços da biblioteca, para controlar também a utilização
de salas de estudo, que podem ser emprestadas apenas alunos e professores, por períodos
de algumas horas do dia. Para continuar utilizando toda a infra-estrutura existente para
controlar também essa nova modalidade de empréstimo, poderíamos ser tentados a incluir
as salas de estudo na hierarquia de livros, periódicos e fitas de vídeo. Uma opção seria criar
uma nova classe abstrata ItemRestrito, para abranger itens como as salas de estudo e
fitas de vídeo, cujo empréstimo é condicionado ao tipo de usuário, como na figura 10.5.
É fácil perceber o resultado a que podemos chegar: algo como um jardim zoológico, onde
pingüins são forçados a dividir um espaço com camelos e girafas, por motivos
absolutamente artificiais.
104 Cap. 10 / Classes Abstratas e Concretas

Fig. 10.5 - Hierarquia com Sala de Estudo

10.6. Exercícios de Fixação

Copyright © 2003, Cecília Rubira. Todos os direitos reservados.

Você também pode gostar