Escolar Documentos
Profissional Documentos
Cultura Documentos
Exemplar
+ bloqueia()
+ desbloqueia()
+ empresta()
+ devolve()
Periódico
Livro
+ empresta()
Curso de PC Magazine
Java
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