Ho un problema concettuale con una corretta implementazione del codice che sembra richiedere l'ereditarietà multipla, che non sarebbe un problema in molte lingue OO, ma poiché il progetto è per Android, non esiste nulla come multiplo extends
.
Ho un sacco di attività, derivata da diverse classi base, come semplice Activity
, TabActivity
, ListActivity
, ExpandableListActivity
, ecc Inoltre ho alcuni frammenti di codice cui devo posto in onStart
, onStop
, onSaveInstanceState
, onRestoreInstanceState
e altri gestori di eventi standard in tutte le attività.
Se ho una singola classe base per tutte le attività, inserisco il codice in una speciale classe derivata intermedia e quindi creo tutte le attività che lo estendono. Sfortunatamente, questo non è il caso, perché ci sono più classi di base. Ma mettere le stesse porzioni di codice in più classi intermedie non è una strada da percorrere, imho.
Un altro approccio potrebbe essere quello di creare un oggetto helper e delegare tutte le chiamate degli eventi sopra citati all'helper. Tuttavia, è necessario includere l'oggetto helper e ridefinire tutti i gestori in tutte le classi intermedie. Quindi non c'è molta differenza nel primo approccio qui - ancora molti duplicati di codice.
Se si verificasse una situazione simile in Windows, sottoclasserei la classe base (qualcosa che "corrisponde" alla Activity
classe in Android) e intrappolerei lì i messaggi appropriati (in un unico posto).
Cosa si può fare in Java / Android per questo? So che ci sono strumenti interessanti come la strumentazione Java ( con alcuni esempi reali ), ma non sono un guru Java e non sono sicuro se valga la pena provare in questo caso specifico.
Se ho perso alcune altre soluzioni decenti, per favore, menzionale.
AGGIORNARE:
Per coloro che potrebbero essere interessati a risolvere lo stesso problema in Android, ho trovato una soluzione semplice. Esiste la classe Application , che fornisce, tra l'altro, l'interfaccia ActivityLifecycleCallbacks . Fa esattamente ciò di cui ho bisogno permettendoci di intercettare e aggiungere un valore in eventi importanti per tutte le attività. L'unico inconveniente di questo metodo è che è disponibile a partire dal livello API 14, che in molti casi non è sufficiente (il supporto per il livello API 10 è un requisito tipico oggi).
decordator pattern
. Questa è l'ultima risorsa, che in realtà dimostra ciò che preferirei evitare: la duplicazione del codice. Accetterò la tua risposta, se non vi saranno altre idee interessanti. Posso forse usare i generici per generalizzare il codice degli "intermedi"?