Eu tenho um problema conceitual com uma implementação adequada de código que parece exigir herança múltipla, que não seria um problema em muitas linguagens OO, mas como o projeto é para Android, não existe algo como múltiplo extends
.
I têm um grupo de actividades, derivadas a partir de diferentes classes de base, tais como simples Activity
, TabActivity
, ListActivity
, ExpandableListActivity
, etc. Também I tem alguns fragmentos de código que eu necessidade de colocar em onStart
, onStop
, onSaveInstanceState
, onRestoreInstanceState
e outros processadores de eventos normais em todas as actividades.
Se eu tiver uma única classe base para todas as atividades, colocaria o código em uma classe derivada intermediária especial e criaria todas as atividades estendendo-o. Infelizmente, esse não é o caso, porque existem várias classes base. Mas colocar as mesmas partes do código em várias classes intermediárias não é um caminho, imho.
Outra abordagem poderia ser criar um objeto auxiliar e delegar todas as chamadas dos eventos mencionados acima ao auxiliar. Mas isso requer que o objeto auxiliar seja incluído e que todos os manipuladores sejam redefinidos em todas as classes intermediárias. Portanto, não há muita diferença para a primeira abordagem aqui - ainda há muitas duplicatas de código.
Se uma situação semelhante ocorresse no Windows, eu subclasseia a classe base (algo que "corresponde" à Activity
classe no Android) e capturaria as mensagens apropriadas (em um único local).
O que pode ser feito em Java / Android para isso? Eu sei que existem ferramentas interessantes, como instrumentação Java ( com alguns exemplos reais ), mas não sou um guru de Java e não tenho certeza se vale a pena tentar neste caso específico.
Se eu perdi outras soluções decentes, mencione-as.
ATUALIZAR:
Para aqueles que podem estar interessados em resolver o mesmo problema no Android, encontrei uma solução simples. Existe a classe Application , que fornece, entre outras coisas, a interface ActivityLifecycleCallbacks . Faz exatamente o que eu preciso, permitindo-nos interceptar e agregar algum valor em eventos importantes para todas as atividades. A única desvantagem desse método é que ele está disponível a partir do nível 14 da API, o que não é suficiente em muitos casos (o suporte ao nível 10 da API é um requisito típico hoje).
decordator pattern
. Este é um último recurso, que, na verdade, demonstra o que eu preferiria evitar - duplicação de código. Aceitarei sua resposta, se nenhuma outra ideia interessante aparecer. Posso usar genéricos para generalizar o código dos "intermediários"?