Vamos implementar novamente o ambiente de simulação de uma sessão de usuário, desta vez usando herança.
As classes Arquivo e Diretorio serão subclasses de uma nova classe, Registro, que possui os atributos e operações comuns a ambas as classes.
Quais são as vantagens desta metodologia?
Agora o conteúdo de um Diretorio é uma lista de Registros (RepositorioRegistros), ao invés de uma
lista de Arquivos e uma lista de Diretorios, que eram exatamente iguais.
Suponha agora que desejamos implementar uma nova função no sistema, com funcionalidade semelhante ao comando ls -R. Ou seja, desejamos poder obter uma listagem recursiva dos arquivos, a partir de um diretório qualquer.
Quais os problemas quando tentamos criar um método lsR na classe Diretório da hierarquia de classes definida?
O método listarR da classe RepositorioRegistros deverá listar recursivamente o conteúdo do Diretorio, que pode ser Arquivos e/ou Diretorios, chamando o método lsR do seu atributo registro que é do tipo Registro e chamando novamente o método listarR do seu atributo proximo que é do tipo RepositorioRegistros, caracterizando assim a recursão. Agora o problema, caso o atributo registro do RepositorioRegistros seja um Arquivo, o método lsR deve apenas imprimir seu nome, já se o mesmo for um Diretorio, o método lsR deverá além de imprimir seu nome chamar o método listar do seu atributo RepositorioRegistros. Lembre-se que um Diretorio tem um atributo conteudo do tipo RepositorioRegistros.
Para evitar esse problema, definimos um metodo abstrato lsR para um Registro (lembre-se que um Registro é uma superclasse de Arquivo e de Diretorio) o qual deverá ser implementado só nas subclasses (Arquivo e Diretorio).
Assim, veja como ficou a versão final...
continuando
Débora Aranha (dcsa@cin.ufpe.br), Sérgio Soares (scbs@cin.ufpe.br) e Rodrigo Queiroz (rqcl@cin.ufpe.br) |