Mam problem koncepcyjny z poprawną implementacją kodu, który wydaje się wymagać wielokrotnego dziedziczenia, co nie byłoby problemem w wielu językach OO, ale ponieważ projekt dotyczy Androida, nie ma czegoś takiego jak wielokrotność extends
.
Mam kilka działań, pochodzący z różnych klas bazowych, takich jak proste Activity
, TabActivity
, ListActivity
, ExpandableListActivity
, itd. Również mam pewne fragmenty kodu które należy umieścić w onStart
, onStop
, onSaveInstanceState
, onRestoreInstanceState
i innych standardowych procedur obsługi zdarzeń we wszystkich działaniach.
Jeśli mam jedną klasę bazową dla wszystkich działań, umieściłem kod w specjalnej klasie pochodnej pośredniej, a następnie utworzę wszystkie działania rozszerzające go. Niestety tak nie jest, ponieważ istnieje wiele klas podstawowych. Ale umieszczenie tych samych części kodu w kilku klasach pośrednich nie jest dobrym rozwiązaniem, imho.
Innym podejściem może być utworzenie obiektu pomocnika i przekazanie pomocnikowi wszystkich wywołań wyżej wymienionych zdarzeń. Wymaga to jednak uwzględnienia obiektu pomocnika i ponownego zdefiniowania wszystkich procedur obsługi we wszystkich klasach pośrednich. Tak więc nie ma większej różnicy w stosunku do pierwszego podejścia tutaj - wciąż dużo duplikatów kodu.
Gdyby podobna sytuacja miała miejsce w systemie Windows, podklasę klasę podstawową (coś, co „odpowiada” Activity
klasie w systemie Android) i wychwytywanie tam odpowiednich komunikatów (w jednym miejscu).
Co można w tym celu zrobić w Javie / Androidzie? Wiem, że istnieją ciekawe narzędzia, takie jak instrumentacja Java ( z kilkoma prawdziwymi przykładami ), ale nie jestem guru Java i nie jestem pewien, czy warto spróbować w tym konkretnym przypadku.
Jeśli przegapiłem jakieś inne przyzwoite rozwiązania, proszę je wymienić.
AKTUALIZACJA:
Dla tych, którzy mogą być zainteresowani rozwiązaniem tego samego problemu w Androidzie, znalazłem proste obejście. Istnieje klasa aplikacji , która zapewnia między innymi interfejs ActivityLifecycleCallbacks . Robi dokładnie to, czego potrzebuję, pozwalając nam przechwytywać i dodawać wartości do ważnych wydarzeń dla wszystkich działań. Jedyną wadą tej metody jest to, że jest ona dostępna od poziomu API 14, co w wielu przypadkach nie wystarcza (obsługa interfejsu API na poziomie 10 jest dziś typowym wymogiem).
decordator pattern
. Jest to ostatnia deska ratunku, która faktycznie pokazuje, czego wolałbym unikać - powielania kodu. Przyjmę twoją odpowiedź, jeśli nie pojawią się inne inspirujące pomysły. Czy mogę użyć generycznych do uogólnienia kodu „półproduktów”?