У мене є концептуальна проблема з правильною реалізацією коду, який, здається, вимагає багаторазового успадкування, це не буде проблемою для багатьох мов OO, але оскільки проект призначений для Android, не існує такого поняття, як кілька extends
.
У мене є купа діяльності, отримана від різних базових класів, таких як простий Activity
, TabActivity
, ListActivity
, ExpandableListActivity
і т.д. Крім того, у мене є деякі фрагменти коду , які мені потрібно місце в onStart
, onStop
, onSaveInstanceState
, onRestoreInstanceState
та інші стандартні обробник подій у всіх видах діяльності.
Якщо у мене є єдиний базовий клас для всіх видів діяльності, я ставлю код у спеціальний проміжний похідний клас, а потім створюю всі дії, що розширюють його. На жаль, це не так, оскільки існує кілька базових класів. Але розміщення одних і тих же частин коду в декількох проміжних класах - це не спосіб, імхо.
Іншим підходом може бути створення об’єкта помічника та делегування всім викликам вищезазначених подій. Але для цього потрібно включити хелперний об’єкт, а всі обробники переробити у всіх проміжних класах. Отже, тут немає великої різниці у першому підході - ще багато дублікатів коду.
Якщо подібна ситуація сталася в Windows, я б підклас базовий клас (те, що "відповідає" Activity
класу в Android) і вловити відповідні повідомлення там (в одному місці).
Що для цього можна зробити в Java / Android? Я знаю, що є цікаві інструменти, такі як інструментарій Java ( з деякими реальними прикладами ), але я не є гуру Java, і не впевнений, чи варто спробувати в цьому конкретному випадку.
Якщо я пропустив якісь інші гідні рішення, будь ласка, згадайте їх.
ОНОВЛЕННЯ:
Для тих, хто може бути зацікавлений у вирішенні тієї ж проблеми в Android, я знайшов просте вирішення. Існує клас Application , який забезпечує, серед іншого, інтерфейс ActivityLifecycleCallbacks . Це робить саме те, що мені потрібно, дозволяючи нам перехоплювати та додавати певну цінність важливим подіям для всіх заходів. Єдиним недоліком цього методу є те, що він доступний починаючи з рівня 14 API, що у багатьох випадках недостатньо (підтримка API рівня 10 є типовою вимогою сьогодні).
decordator pattern
. Це в крайньому випадку, котрий насправді демонструє те, чого я хотів би уникати - дублювання коду. Я прийму вашу відповідь, якщо жодних інших натхненних ідей не буде. Чи можу я використати дженерики для узагальнення коду "проміжних продуктів"?