É possível se pensar em funcionalidades no nível abstrato que se baseiam na previsão do que será implementado nas subclasses.
A seguir é apresentada a classe ListStr
que representa uma lista de forma abstrata. Essa lista mantém um registro do elemento corrente, trata-se do próximo elemento que será considerado nas operações de acesso a elementos (first
e next
).
Uma ListStr
define as seguintes três operações:
add()
- adiciona um novo elemento na lista;first()
- desloca o elemento corrente para a primeira posição da lista e retorna esse primeiro elemento (retorna nulo se não houver primeiro);next()
- desloca o elemento corrente para a próxima posição (a partir da sua última posição) da lista e retorna esse próximo elemento (retorna nulo se não houver próximo).Note que foi implementado um método list()
que parte do pré-suposto de que existe uma implementação de first()
e next()
. Isso faz com que você possa implementar a lista de várias maneiras e o método list()
se adapte automaticamente às implementações dos herdeiros.
Implemente uma classe herdeita de ListStr
(não abstrata) chamada ListSequence
que armazene uma lista de dados de tamanho máximo fixo (informado no construtor) e implemente os métodos add()
, first()
e next()
. Considere que um elemento é sempre adicionado no final da lista (em sequência).
In [1]:
public abstract class ListStr {
public abstract void add(String element);
public abstract String first();
public abstract String next();
public void list() {
String element = first();
while (element != null) {
System.out.println(element);
element = next();
}
}
}
Out[1]:
In [ ]:
Escreva instruções que testem a sua lista.
In [ ]:
Considere que você vai criar uma segunda implementação de lista de tamanho máximo fixo chamada ListOrdered
que mantem os elementos ordenados alfabeticamente. Implemente esta classe seguindo a estrutura proposta no diagrama UML:
ListSequence
(que você implementou anteriormente) e ListOrdered
passarão a ser herdeiras de uma outra classe abstrata chamada ListFix
. Considerando ambas as listas tem tamanho máximo fixo, uma ou algumas das operações serão comuns às duas e deverão ser deslocadas para ListFix
.
In [ ]:
Escreva um código que teste as duas classes: ListSequence
e ListOrdered
.
In [ ]:
Implemente uma classe herdeira de ListStr
que armazene seus dados em uma árvore binária de classificação. Apesar de ser uma árvore, externamente a classe se comporta com uma lista. Considere, por exemplo, que as operações de first
e next
vão para o próximo elemento na ordem alfabética da árvore, ou seja, estas operações implementam os passos de um caminhamento em ordem.
In [ ]:
Escreva instruções que testem a sua nova lista.
In [ ]: