2010-05-18 9 views
12

¿Hay alguna manera de averiguar el nombre de la clase derivada de una instancia de clase base?¿Cómo averiguar la subclase de la instancia de la clase base?

ej .:

class A{ 
    .... 
} 
class B extends A{ 
    ... 
} 
class c extends A{ 
    ... 
} 

ahora si un método devuelve un objeto de A, puedo saber si es de tipo B o C?

+7

Tenga en cuenta que [type sniffing] (http://www.javapractices.com/topic/TopicAction.do?Id=3) es un poco olor a código. No siempre es lo incorrecto, pero es el enfoque equivocado con la frecuencia suficiente como para que le eche un vistazo a su diseño. Si es posible, confíe en el polimorfismo (pero consulte también [Cuando el polimorfismo falla] de Steve Yegge (http://sites.google.com/site/steveyegge2/when-polymorphism-fails)). – outis

Respuesta

17

utilizando instanceof o Class#getClass()

A returned = getA(); 

if (returned instanceof B) { .. } 
else if (returned instanceof C) { .. } 

getClass() volvería cualquiera de: A.class, B.class, C.class

Dentro de la cláusula si lo necesita abatido - es decir

((B) returned).doSomethingSpecificToB(); 

Dicho esto, a veces se considera que el uso de instanceof o getClass() es una mala práctica. Debería usar polymorphism para tratar de evitar la necesidad de buscar la subclase concreta, pero no puedo decirle más con la información proporcionada.

+1

+1 por golpearme. –

+1

Una nota sobre el uso de polimorfismo en esta situación: puede tener un método 'getType()' o algo similar en la implementación de 'A' y anular ese método en' B' y 'C'. Como todos los métodos son virtuales en Java, una llamada a 'getType()' resolvería el subtipo específico. – aioobe

4

¿Ha intentado utilizar instanceof

por ejemplo,

Class A aDerived= something.getSomethingDerivedFromClassA(); 

if (aDerived instanceof B) { 

} else if (aDerived instanceof C) { 

} 

//Use type-casting where necessary in the if-then statement. 
2

Respuesta corta a su pregunta

¿Hay una manera de averiguar el nombre de la clase derivada de un objeto de clase base?

sin, la super-clase no tiene forma de saber el nombre/tipo de una subclase.

Tiene que interrogar al objeto (que es una instancia de una subclase) y preguntar si es una: instanceof una subclase en particular, o llamar a su método getClass().

0

Hay 2 maneras que puedo pensar en 1) Uno con el uso de la reflexión de la API de Java 2) Otro Una de ellas sería la instanceOf

Otro método puede ser una comparación de objetos a objetos, no sé cómo que sea, puede probar esta

0

puede hacerlo en la subclase constructor

class A { 
    protected String classname; 
    public A() { this.classname = "A"; } 
    public String getClassname() { return this.classname; } 
} 
class B extends A { 
    public B() { 
     super(); 
     this.classname = "B"; 
    } 
} 

Así

A a = new A(); 
a.getClassname(); // returns "A" 
B b = new B(); 
b.getClassname(); // returns "B" 
((A)b).getClassname(); // Also returns "B" 

Como se convierte en un objeto "A", llamará a la función "A" getClassname() pero devolverá un valor establecido por el constructor que fue el constructor "B".

Nota: Llame a super(); antes de que

0

¿Hay una manera de averiguar el nombre de la clase derivada de una instancia de la clase base?

como respondida here, puede utilizar esta extremadamente simple enfoque.

abstract class A { 
    public final String getName() { 
     return this.getClass().getName(); 
    } 
} 

class B extends A { } 

class C extends A { } 

entonces simplemente imprimir la corriente class nombre:

B b = new B(); 
C c = new C(); 

System.out.println(b.getName()); 
System.out.println(c.getName()); 

Salida:

com.test.B 
com.test.C 

No hay necesidad de almacenar adicional Strings, comprobar instanceof o override el método en cualquier subclase.

Cuestiones relacionadas