web-dev-qa-db-fra.com

Obtenir le nom de la classe enfant du parent

J'ai une classe de base pour toutes mes activités (ActivityBase) qui elle-même dérive de Android.app.Activity. Dans onCreate, je souhaite exécuter une logique conditionnelle basée sur la classe enfant en cours d'exécution. Si SomeCustomActivity et AnotherCustomActivity étendent tous les deux ActivityBase, comment puis-je déterminer dans la classe parente (ActivityBase) lequel des deux est actuellement en cours d'exécution?

26
Rich

Utilisez instanceof operator.

Supposons que vous ayez une classe de base et deux sous-classes nommées Base, SubOne et SubTwo, si vous voulez vérifier si une variable ref est une instance de SubOne ou SubTwo, vous diriez

if(ref instanceof SubOne){
}
else if(ref instanceof SubTwo){
}

Notez que: (ref instanceof Base) retournera toujours true si.

15
Samuh

Parfois, cette ligne de la classe parente résout ce problème. Il retourne le nom de la classe "enfant" (pas le parent):

this.getClass().getName() //String like "com.mycompany.myclassname"
this.getClass().getSimpleName() //String like "myclassname"

Voir ici pour plus de détails: http://www.coderanch.com/t/324715/Java/java/Getting-child-class-name-parent

60
OneWorld

Je pense que vous voulez utiliser l'opérateur instanceof, par exemple:

if(this instanceof SomeCustomActivity) {
    // do stuff
} else if (this instanceof AnotherCustomActivity) {
    // do other stuff
}

Et c'est tout ce qu'il y a à faire.

3
Robert Massaioli

Au lieu d'utiliser une instruction if, créez une méthode abstraite pour votre logique conditionnelle. Ensuite, demandez à la classe enfant d'exécuter le code qui lui est correct.

Cela vous évitera également de devoir modifier la classe de base chaque fois que vous créez une nouvelle classe enfant.

2
mkrussel

Dans votre super classe, la méthode create pour la condition chargée de répondre à la question est la sous-classe du type X. Dans la logique de traitement, utilisez cette méthode pour décider du bloc de code à exécuter. Chaque sous-classe peut annuler la méthode de décision et répondre au besoin. En conséquence, votre super-classe n'a aucune connaissance des sous-classes et les sous-classes n'ont pas à s'inquiéter de la mise en œuvre réelle du traitement. 

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;
    }
}

Pour plus d'informations, voir Principe d'Hollywood .

1
user3511097

Vous pouvez également utiliser la méthode .getClass () du parent, puis vérifier comme ceci

if(parent.getClass().equals(childObj.class)){
//to do ..
}

Cela fonctionne essentiellement car il retourne la classe d'objet d'exécution ..__ Cela fonctionnera particulièrement dans le cas de classes abstraites - Essayé et testé récemment par moi dans mon projet.

0
Abdeali Chandanwala