Ich habe ein konzeptionelles Problem mit einer ordnungsgemäßen Implementierung von Code, die scheinbar eine Mehrfachvererbung erfordert. Dies wäre in vielen OO-Sprachen kein Problem, aber da das Projekt für Android ist, gibt es keine Mehrfachvererbung extends
.
Ich habe eine Reihe von Aktivitäten, die von verschiedenen Basisklassen abgeleitet ist , wie einfach Activity
, TabActivity
, ListActivity
, ExpandableListActivity
, etc. Auch habe ich einige Code - Fragmente , die ich Platz brauche in onStart
, onStop
, onSaveInstanceState
, onRestoreInstanceState
und anderen Standard - Event - Handler in allen Aktivitäten.
Wenn ich für alle Aktivitäten eine einzige Basisklasse habe, platziere ich den Code in einer speziellen abgeleiteten Zwischenklasse und erstelle dann alle Aktivitäten, mit denen er erweitert wird. Dies ist leider nicht der Fall, da es mehrere Basisklassen gibt. Aber die gleichen Teile des Codes in mehrere Zwischenklassen einzuteilen, ist kein Weg, imho.
Ein anderer Ansatz könnte darin bestehen, ein Helferobjekt zu erstellen und alle Aufrufe der oben genannten Ereignisse an den Helfer zu delegieren. Dies erfordert jedoch, dass das Hilfsobjekt eingeschlossen und alle Handler in allen Zwischenklassen neu definiert werden. Es gibt also keinen großen Unterschied zum ersten Ansatz hier - immer noch viele Code-Duplikate.
Wenn eine ähnliche Situation unter Windows auftritt, würde ich die Basisklasse (etwas, das der Activity
Klasse in Android "entspricht") in Unterklassen unterteilen und entsprechende Nachrichten dort abfangen (an einem einzigen Ort).
Was kann man in Java / Android dafür tun? Ich weiß, dass es interessante Tools wie Java-Instrumentierung gibt ( mit einigen echten Beispielen ), aber ich bin kein Java-Guru und nicht sicher, ob es sich lohnt, es in diesem speziellen Fall zu versuchen.
Wenn ich andere anständige Lösungen verpasst habe, erwähnen Sie sie bitte.
AKTUALISIEREN:
Für diejenigen, die das gleiche Problem in Android lösen möchten, habe ich eine einfache Lösung gefunden. Es gibt die Application- Klasse, die unter anderem das Interface ActivityLifecycleCallbacks bereitstellt . Es tut genau das, was ich brauche, damit wir wichtige Ereignisse für alle Aktivitäten abfangen und aufwerten können. Der einzige Nachteil dieser Methode ist, dass sie ab API-Level 14 verfügbar ist, was in vielen Fällen nicht ausreicht (die Unterstützung von API-Level 10 ist heutzutage eine typische Anforderung).
decordator pattern
. Dies ist ein letzter Ausweg, der tatsächlich zeigt, was ich lieber vermeiden würde - Code-Duplizierung. Ich nehme Ihre Antwort an, wenn keine anderen Ideen auftauchen. Kann ich möglicherweise Generika verwenden, um den Code der "Intermediates" zu verallgemeinern?