Ich habe eine Basisklasse für alle meine Aktivitäten (ActivityBase
), die sich selbst ableitet android.app.Activity
. In onCreate möchte ich eine bedingte Logik basierend auf der aktuell ausgeführten untergeordneten Klasse ausführen. Wenn SomeCustomActivity
und AnotherCustomActivity
beide verlängern ActivityBase
wie kann ich in der übergeordneten Klasse (ActivityBase
) Welcher der beiden ist der derzeit ausführende?
Holen Sie sich den Namen der untergeordneten Klasse vom übergeordneten Element
Reich
In manchen Fällen löst diese Zeile in der Elternklasse dieses Problem. Es gibt den Namen der “untergeordneten” Klasse (nicht der übergeordneten) zurück:
this.getClass().getName() //String like "com.mycompany.myclassname"
this.getClass().getSimpleName() //String like "myclassname"
Siehe hier für weitere Diskussion: http://www.coderanch.com/t/324715/java/java/Getting-child-class-name-parent
Samuh
Verwenden Instanzvon Operator.
Angenommen, Sie haben eine Basisklasse und zwei benannte Unterklassen Base
, SubOne
und SubTwo
wenn Sie überprüfen möchten, ob eine Variable ref
ist eine Instanz von SubOne
oder SubTwo
du würdest sagen:
if(ref instanceof SubOne){
}
else if(ref instanceof SubTwo){
}
Beachten Sie, dass: (ref instanceof Base)
wird immer wiederkommen true
obwohl.
-
Dies ist keine objektorientierte Lösung. Sie sind besser dran, wenn Sie this.getClass().getSimpleName() verwenden. Auf diese Weise müssen Sie Ihren übergeordneten Code nicht jedes Mal ändern, wenn Sie eine neue untergeordnete Klasse einführen. Oder geben Sie dem Elternteil eine abstrakte Methode namens getName(), damit jedes Kind seinen eigenen Namen zurückgibt.
– Evvo
24. April 2017 um 18:40 Uhr
Anstatt eine if-Anweisung zu verwenden, sollten Sie eine abstrakte Methode für Ihre bedingte Logik erstellen. Lassen Sie dann die untergeordnete Klasse den richtigen Code ausführen.
Dadurch müssen Sie auch nicht jedes Mal die Basisklasse ändern, wenn Sie eine neue untergeordnete Klasse erstellen.
-
Ich muss aber nichts immer wieder neu implementieren. Ich möchte nur herausfinden, ob die Aktivität einen bestimmten Code ausführen soll, andernfalls überspringen. Nehmen wir zum Beispiel an, 15 tun es und 15 tun es nicht. Alle 15 sollten denselben Codeblock ausführen … sollten in der Basisklasse ausgeführt und nur bedingt ausgeführt werden.
– Reich
4. März 2011 um 20:13 Uhr
Ich denke, Sie möchten den instanceof-Operator verwenden, zum Beispiel:
if(this instanceof SomeCustomActivity) {
// do stuff
} else if (this instanceof AnotherCustomActivity) {
// do other stuff
}
Und das ist alles, was dazu gehört.
Sie können auch die Methode .getClass() des übergeordneten Elements verwenden und dann wie folgt überprüfen
if(parent.getClass().equals(childObj.class)){
//to do ..
}
Dies funktioniert im Grunde, weil es die Laufzeitobjektklasse zurückgibt. Dies funktioniert besonders bei abstrakten Klassen – Kürzlich von mir in meinem Projekt erprobt und getestet.
Benutzer3511097
Erstellen Sie in Ihrer Oberklasse eine Methode für die Bedingung, die für die Beantwortung der Frage verantwortlich ist – die Unterklasse ist eine vom Typ X. In der Verarbeitungslogik verwenden Sie diese Methode, um zu entscheiden, welcher Codeblock ausgeführt werden soll. Jede Unterklasse kann die Entscheidungsmethode überschreiben und nach Bedarf antworten. Als Ergebnis hat Ihre Superklasse kein Wissen über Unterklassen und Unterklassen müssen sich nicht um die eigentliche Verarbeitungsimplementierung kümmern.
abstract class A {
abstract boolean isItX();
void doX() { ... }
void doY() { ... }
void process() {
if (isItX()) {
doX();
} else {
doY();
}
}
}
class B extends A {
boolean isItX() {
return true;
}
}
class C extends A {
boolean isItX() {
return false;
}
}
Weitere Informationen finden Sie unter Hollywood-Prinzip.
Die Frage und der Titel stimmen nicht überein. Sie möchten den Namen der untergeordneten Klasse überhaupt nicht. Vielmehr möchten Sie testen, ob
this
ist eine Instanz einer bestimmten untergeordneten Klasse.– Stefan C
3. März 2011 um 3:36 Uhr
Wird die Superklasse nicht auch „Eltern“ genannt? Ich habe Beziehungen gehört, die so definiert sind, dass A von B abstammt – B ist der Elternteil, A ist das Kind.
– Reich
3. März 2011 um 3:45 Uhr
Ja, die Superklasse wird als Elternklasse bezeichnet, aber Sie müssen nicht unbedingt den Namen der Kindklasse kennen, Sie müssen nur wissen, von welcher Klasse das Kind eine Instanz ist.
– Gailbär
3. März 2011 um 21:22 Uhr
Ich weiß zu schätzen, dass ich die Semantik falsch verstanden habe, aber ich persönlich möchte eigentlich den Namen. Ich möchte, dass sich meine Aktivitäten auf eine von zwei Arten verhalten, also wollte ich eine Liste von Aktivitäten in BaseActivity deklarieren und sagen: “Wenn die aktuell ausgeführte Aktivität eine von denen in dieser Liste ist, führe diesen Codeblock aus”. Ich dachte, dass das Führen einer Namensliste die sauberste Lösung wäre. Ich brauche nicht alle Aktivitäten, um es zu implementieren, weil es dasselbe ist (wäre wiederholter Code). Ich denke, ich könnte eine List oder ähnliches erstellen, anstatt die Namen zu vergleichen.
– Reich
4. März 2011 um 20:10 Uhr