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?
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.
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
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.
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.
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 .
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.