Rico
Tengo una clase base para todas mis actividades (ActivityBase
) que a su vez se deriva de android.app.Activity
. En onCreate, quiero ejecutar alguna lógica condicional basada en la clase secundaria que se está ejecutando actualmente. Si SomeCustomActivity
y AnotherCustomActivity
ambos se extienden ActivityBase
¿cómo puedo determinar en la clase principal (ActivityBase
) ¿cuál de los dos es el que se está ejecutando actualmente?
En algunas ocasiones simplemente esta línea en la clase padre soluciona este problema. Devuelve el nombre de la clase “hijo” (no el padre):
this.getClass().getName() //String like "com.mycompany.myclassname"
this.getClass().getSimpleName() //String like "myclassname"
Ver aquí para más discusión: http://www.coderanch.com/t/324715/java/java/Getting-child-class-name-parent
samuh
Usar en vez de operador.
Supongamos que tiene una clase base y dos subclases llamadas Base
, SubOne
y SubTwo
si desea comprobar si una variable ref
es una instancia de SubOne
o SubTwo
dirías:
if(ref instanceof SubOne){
}
else if(ref instanceof SubTwo){
}
Tenga en cuenta que: (ref instanceof Base)
siempre volveré true
aunque.
-
Esta no es una solución orientada a objetos. Es mejor que uses this.getClass().getSimpleName(). De esa manera, no tendrá que modificar su código principal cada vez que introduzca una nueva clase secundaria. O dale al padre un método abstracto llamado getName() para que cada hijo devuelva su propio nombre.
– Evo
24/04/2017 a las 18:40
En lugar de usar una declaración if, debe crear un método abstracto para su lógica condicional. Luego, haga que la clase secundaria ejecute el código correcto para ella.
Esto también evitará que tenga que modificar la clase base cada vez que cree una nueva clase secundaria.
-
Sin embargo, no necesito volver a implementar nada una y otra vez. Solo quiero saber si la Actividad es una que debería ejecutar una determinada pieza de código, de lo contrario, sáltela. Digamos que 15 sí y 15 no, por ejemplo. Los 15 deben ejecutar el mismo bloque de código… debe hacerse en la clase base y solo ejecutarlo condicionalmente.
– Rico
4 de marzo de 2011 a las 20:13
Creo que quieres usar el operador instanceof, por ejemplo:
if(this instanceof SomeCustomActivity) {
// do stuff
} else if (this instanceof AnotherCustomActivity) {
// do other stuff
}
Y eso es todo lo que hay que hacer.
También puede usar el método .getClass() del padre y luego verificar así
if(parent.getClass().equals(childObj.class)){
//to do ..
}
Básicamente, esto funciona porque devuelve la clase de objeto de tiempo de ejecución. Esto funcionará especialmente en el caso de clases abstractas. Probado y probado recientemente por mí en mi proyecto.
usuario3511097
En su superclase, el método de creación para la condición responsable de responder la pregunta es la subclase uno del tipo X. En la lógica de procesamiento, use este método para decidir qué bloque de código ejecutar. Cada subclase puede anular el método de decisión y responder según sea necesario. Como resultado, su súper clase no tiene conocimiento sobre las subclases y las subclases no tienen que preocuparse por la implementación del procesamiento real.
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;
}
}
Para más información, ver Principio de Hollywood.
La pregunta y el título no coinciden. No desea el nombre de las clases secundarias en absoluto. Más bien quieres probar si
this
es una instancia de una clase secundaria particular.– Esteban C.
3 de marzo de 2011 a las 3:36
¿La superclase no se llama también “padre”? Escuché relaciones definidas como A deriva de B – B es el padre, A es el hijo.
– Rico
3 de marzo de 2011 a las 3:45
Sí, la superclase se llama padre, pero no necesita saber específicamente el nombre de la clase secundaria, solo necesita saber de qué clase es una instancia.
– oso gallego
3 de marzo de 2011 a las 21:22
Aprecio que me haya equivocado en la semántica, pero personalmente quiero el nombre. Quiero que mis actividades se comporten de una de dos maneras, por lo que quería declarar una lista de actividades en BaseActivity y decir “si la actividad que se está ejecutando actualmente es una de las de esta lista, ejecute este bloque de código”. Estaba pensando que mantener una lista del nombre sería la solución más limpia. No necesito todas las actividades para implementarlo porque es lo mismo (sería código repetido). Supongo que podría hacer una Lista o algo así en lugar de comparar los nombres.
– Rico
4 de marzo de 2011 a las 20:10