2011-06-10 7 views

Respuesta

37

Yes, lo haría. ¿Y por qué no?

Porque child es, de hecho, una instancia de Parent. Si, desea llevar a cabo una operación para un niño debe comprobar

if (child instanceof Child){ 
} 

Sin embargo, debe recordar lo siguiente declaración de efectivo de C++, por Scott Meyers:

"Cada vez que se encuentre escribiendo código de la forma "si el objeto es de tipo T1 , a continuación, hacer algo, pero si es de tipo T2, a continuación, hacer algo otra cosa," bofetada a sí mismo.

, que creo que también se aplica en este caso. Si quiere doSomething según el tipo de clase al que pertenece el objeto al que se hace referencia, la siguiente estructura de código debería ayudarlo.

NOTA: No lo he compilado.

class Parent { 
    public void doSomething() { 
     System.out.println("I am the Parent, and I do as I like"); 
    } 
} 

class ChildA extends Parent { 
    public void doSomething() { 
     System.out.println("I am a child named A, but I have my own ways, different from Parent"); 
    } 
} 

class ChildB extends Parent { 
    public void doSomething() { 
     System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings"); 
    } 
} 

public class Polymorphism101 { 

    public static void main() { 

     Parent p = new Parent(); 
     p.doSomething(); 

     p = new ChildA(); 
     p.doSomething(); 

     p = new ChildB(); 
     p.doSomething(); 

    } 

} 
+0

pero determino el tipo de objeto en tiempo de ejecución y necesito definir una referencia principal para contener todos los tipos de elementos secundarios. ¿Cómo puedo hacer eso de la otra manera? – ikbal

+0

@ user479129: Puede mantener una referencia a cualquiera de los hijos del padre en una referencia de tipo padre. Es decir, si hay una 'clase Parent {}' y 'clase ChildA extends Parent' y' class ChildB extends Parent' entonces puedes usar 'Parent p' para referir un objeto de tipo' ChildA' o 'ChildB', pero yo no entiendas lo que quieres decir a la inversa. –

+0

Necesito controlar ese objeto p es un tipo de su hijo, no el padre. en algunos casos puede ser del tipo padre, así que necesito verificar que sea exactamente del tipo que quiero. eso es lo que quiero. Espero que esté claro – ikbal

0

supuesto que devuelve cierto porque los niños es una instancia de la matriz

0

. instanceof será verdadero siempre que la referencia (lado izquierdo de la expresión instanceof) se pueda convertir al ReferenceType (el tipo en el lado derecho de la expresión instanceof). Esto será cierto para las subclases en relación con sus padres:

Child child = new Child(); 
Parent parent = (Parent) child; //works! 
assert child instanceof Parent; //true 

De The Java Language Specification, Java SE 9 Edition:

15.20. Relational Operators
...
RelationalExpression instanceof ReferenceType

15.20.2. Type Comparison Operator instanceof
...
En tiempo de ejecución, el resultado del operador instanceof es true si el valor de la RelationalExpression no es null y la referencia podría ser arrojado a la ReferenceType sin levantar un ClassCastException. De lo contrario, el resultado es false.

Cuestiones relacionadas