Holen Sie sich den Namen der untergeordneten Klasse vom übergeordneten Element

Lesezeit: 4 Minuten

Benutzeravatar von Rich
Reich

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 ActivityBasewie kann ich in der übergeordneten Klasse (ActivityBase) Welcher der beiden ist der derzeit ausführende?

  • 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

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

Samuhs Benutzeravatar
Samuh

Verwenden Instanzvon Operator.

Angenommen, Sie haben eine Basisklasse und zwei benannte Unterklassen Base, SubOne und SubTwowenn 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.

Benutzeravatar von user3511097
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.

1431790cookie-checkHolen Sie sich den Namen der untergeordneten Klasse vom übergeordneten Element

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy