Wie kann eine Klasse in einem Android-Bibliotheksprojekt überschrieben werden?

9

Folgendes ist meine Situation:

Ich habe ein Bibliotheksprojekt und ein darauf basierendes Projekt. Jetzt in der Bibliothek habe ich zwei Klassen A und B, wobei A B verwendet. In dem Projekt, das die Bibliothek verwendet, habe ich eine andere Klasse B, die die Klasse B aus der Bibliothek überschreiben sollte.

Aber jedes Mal, wenn Klasse A einen Anruf tätigt, endet sie in der Klasse B aus der Bibliothek. Wie kann ich Android sagen, dass Klasse B von meinem Projekt sollte anstelle von Klasse B aus der Bibliothek verwendet werden?

    
VKurt 03.07.2011, 16:38
quelle

3 Antworten

3

Das funktioniert nicht mit dem aktuellen Layout. Sie müssen das Strategie-Muster verwenden. Definieren Sie LibA in Ihrer Bibliothek mit einem Konstruktor, der im Konstruktor ein Objekt vom Typ LibB verwendet:

%Vor%

Dann können Sie LibB in Ihrem Projekt überschreiben und LibA mit der Klasse erstellen, die LibB erweitert:

%Vor%

Antwort auf Turbos Frage:

Sie möchten Projektaktivitäten aus Ihrer Bibliothek starten. Also dann verschiebe den Code, der Intent erzeugt in deine Projekte , denn nur in deinem Projekt kennst du den Typ oder den Namen des Activity , das gestartet werden soll.

Die Lösung, die Sie in Ihrem Kommentar erwähnt haben ( hier ) erstellt das Intent im Bibliotheksprojekt, indem der Name des zu startenden Activity erraten wird. Daran ist eigentlich nichts falsch, aber es ist keine elegante Lösung. Sie können Activities nur nach diesem speziellen Benennungsschema starten. Und deshalb können Sie nicht beliebig Activities starten, die in Ihren Projekten sichtbar sind wie Activities aus anderen Bibliotheken, wo Sie den Namen der Klasse nicht ändern können.

Um die Intent -Erstellung in Ihre Bibliotheken zu verschieben, können Sie z. B. das Strategie-, Muster- oder Fabrikmethodenmuster verwenden. Siehe Designmuster auf Wikipedia für noch mehr (kreative) Muster, die zu Ihrem Bibliotheksdesign passen.

Eine einfache Lösung wäre:

Erstellen Sie eine Zusammenfassung LibraryActivity und erweitern Sie Ihre ProjectActivities daraus. Das LibraryActivity definiert eine abstrakte Methode, die das Intent zurückgibt. Die Implementierung dieser abstrakten Methode erfolgt in Ihrem ProjectActivities .

%Vor%     
thaussma 03.07.2011, 16:54
quelle
0

Wie ich aus Ihrem Kommentar sehe, haben Sie Klasse A, die Klasse B verwendet

Aber Klasse B sollte sich je nachdem, welches Projekt Sie verwenden, unterscheiden.

Ich denke, Sie müssen eine Basisklasse z. B. BaseB erstellen, die eine Instanzvariable in Klasse A sein wird, und Sie könnten einen Setter und Getter dafür haben. Oder Sie können einen Parameter an den Konstruktor der Klasse A. übergeben Wenn Sie A instanziieren, sollten Sie auswählen, welches Sie verwenden möchten.

Schauen wir uns den Code an

%Vor%     
mohamede1945 03.07.2011 16:58
quelle
0

Ich weiß nicht, ob das der beste Weg ist, es zu tun, aber ich mache es so;

Ich erstelle eine Klasse A aus dem Projekt und diese Klasse erweitert sich um das Bibliotheksprojekt

%Vor%     
Yayo28 27.02.2012 07:17
quelle