49 votes

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 ) laquelle des deux est actuellement en exécuter un ?

110voto

OneWorld Points 6140

Dans certaines occasions, simplement cette ligne dans la classe parente résout ce problème. Il renvoie 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 une discussion plus approfondie : http://www.coderanch.com/t/324715/java/java/Getting-child-class-name-parent

18voto

Samuh Points 16564

Utilisez l'opérateur instanceof.

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) renverra toujours true .

3voto

mkrussel Points 136

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

Cela vous évitera également d'avoir à modifier la classe de base à chaque fois que vous créez une nouvelle classe enfant.

2voto

Robert Massaioli Points 6672

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.

2voto

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 renvoie la classe d'objets d'exécution. Cela fonctionnera particulièrement dans le cas de classes abstraites - Essayé et testé récemment par moi dans mon projet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X