A Incrível Máquina Abstrata

The Incredible Abstract Machine (TIAM)

Implementando funcionalidades no nível asbtrato

É 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.

Tarefa 1

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]:
com.twosigma.beaker.javash.bkrf4f9bd07.ListStr

In [ ]:

Escreva instruções que testem a sua lista.


In [ ]:

Tarefa 2

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 [ ]:

Tarefa 3

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 [ ]: