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, Repositorio, 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 Repositorio (Lista_rep), 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 Lista_rep deverá listar recursivamente o conteúdo do Diretorio, que pode ser Arquivos e/ou Diretorios, chamando o método lsR do seu atributo Rep que é do tipo Repositorio e chamando novamente o método listarR do seu atributo proximo que é do tipo Lista_rep, caracterizando assim a recursão. Agora o problema, caso o atributo Rep da Lista_rep 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 listarR do seu atributo Lista_rep. Lembre-se que um Diretorio tem um atributo conteudo do tipo Lista_rep.
Para evitar esse problema, definimos um metodo abstrato lsR para um Repositorio (lembre-se que um Repositorio é 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@di.ufpe.br) e Sérgio Soares (scbs@di.ufpe.br) |