J'ai un problème conceptuel avec une implémentation correcte du code qui semble nécessiter un héritage multiple, ce ne serait pas un problème dans de nombreux langages OO, mais comme le projet est pour Android, il n'y a rien de tel que multiple extends
.
J'ai un tas d'activités, provenant de différentes classes de base, comme simples Activity
, TabActivity
, ListActivity
, ExpandableListActivity
, etc. De plus j'ai quelques fragments de code que je dois lieu dans onStart
, onStop
, onSaveInstanceState
, onRestoreInstanceState
et autres gestionnaires d'événements standard dans toutes les activités.
Si j'ai une seule classe de base pour toutes les activités, je placerais le code dans une classe dérivée intermédiaire spéciale, puis créerais toutes les activités en l'étendant. Malheureusement, ce n'est pas le cas, car il existe plusieurs classes de base. Mais placer les mêmes portions de code dans plusieurs classes intermédiaires n'est pas une solution, à mon humble avis.
Une autre approche pourrait être de créer un objet d'assistance et de déléguer tous les appels des événements susmentionnés à l'aide. Mais cela nécessite que l'objet d'assistance soit inclus et que tous les gestionnaires soient redéfinis dans toutes les classes intermédiaires. Il n'y a donc pas beaucoup de différence avec la première approche ici - encore beaucoup de doublons de code.
Si une situation similaire se produisait sous Windows, je sous-classerais la classe de base (quelque chose qui "correspond" à la Activity
classe dans Android) et y intercepterais les messages appropriés (en un seul endroit).
Que peut-on faire en Java / Android pour cela? Je sais qu'il existe des outils intéressants tels que l'instrumentation Java ( avec de vrais exemples ), mais je ne suis pas un gourou de Java, et je ne sais pas si cela vaut la peine d'essayer dans ce cas spécifique.
Si j'ai raté d'autres solutions décentes, veuillez les mentionner.
MISE À JOUR:
Pour ceux qui pourraient être intéressés à résoudre le même problème dans Android, j'ai trouvé une solution de contournement simple. Il existe la classe Application , qui fournit, entre autres, l'interface ActivityLifecycleCallbacks . Il fait exactement ce dont j'ai besoin, nous permettant d'intercepter et d'ajouter de la valeur à des événements importants pour toutes les activités. Le seul inconvénient de cette méthode est qu'elle est disponible à partir du niveau 14 de l'API, ce qui n'est pas suffisant dans de nombreux cas (la prise en charge du niveau 10 de l'API est aujourd'hui une exigence typique).
decordator pattern
. Il s'agit d'un dernier recours, qui montre bien ce que je préfère éviter: la duplication de code. J'accepterai votre réponse, si aucune autre idée instante n'apparaît. Puis-je éventuellement utiliser des génériques pour généraliser le code des "intermédiaires"?