2010-04-23 47 views
9

Si tengo una clase base Base thing = null; de los cuales hay una subclase class Subclass extends Base y me instigan como thing = new Subclass ¿Cómo voy a llamar a un método que es específicamente en la subclase, pero no ¿en base? ej. Base sólo tiene method() Subclass ha method() y specialMethod() el método specialMethod() es el que quiero llamar.Llamar a un método de subclase en Java

+2

En general, es una mala idea. Si sabes que el objeto es de tipo Subclase, entonces refiérete a eso y no tienes ningún problema. Si el método realmente pertenece en Base, póngalo en Base. –

Respuesta

12

Si sabe que contiene una thingSubclass, que puede hacer:

((Subclass) thing).specialMethod() 
+6

Tenga en cuenta que si cosa no es una 'Subclase', esto bombardeará con una 'ClassCastException' ... use' instanceof' para comprobar si 'thing' es una 'Subclase' primero si no está seguro. – Powerlord

1

Usted tiene que escribir, o lanzas cosa a la subclase. Por lo tanto:

 Subclass thing = new Subclass(); 

o:

 ((Subclass) thing).specialMethod(); 
7

Tienes que cast que sea capaz de invocar el método:

Base thing = new SubClass(); 

((SubClass) thing).specialMethod(); 

Si se enfrenta a esta situación, más probable es que no lo hace tener la interfaz de la derecha (el conjunto adecuado de métodos)

Antes de profundizar en la etapa donde de empezar a validar todo para saber si se puede invocar un método o no como en:

public void x (Base thing) { 
    if(thing.instanceof Subclass) { 
     ((SubClass)thing).specialMethod(); 
    } 
} 

considerar si no es necesario para mover el specialMethod arriba en la jerarquía por lo que pertenece a la base.

Si definitivamente no lo necesita en la base, pero que lo necesite en la subclase al menos considerar usar el tipo correcto:

SubClass thing = ... 
// no need to cast 
thing.specialMethod(); 

Pero como siempre, esto depende de lo que estás tratando de hacer.

+0

Esa declaración 'if' probablemente debería tener' else' ... –

3

trabajar con la herencia/polimorfismo en Java existen básicamente dos tipos de moldes que se ven:

upcasting:

Superclass x = new Subclass(); 

Esto está implícito y no necesita un yeso duro porque Java sabe que todo el Superclass puede hacer, la Subclass puede hacer así.

downcasting

Superclass x = new Subclass(); 

Subclass y = (Subclass) x; 

En este caso lo que necesita hacer un molde duro porque Java no está muy seguro de si esto va a funcionar o no. Tienes que consolarlo diciéndole que sabes lo que estás haciendo. La razón de esto es porque la subclase podría tener algunos métodos extraños que la superclase no tiene.

En general, si desea crear una instancia de una clase para llamar a algo en su subclase, probablemente solo debe crear una instancia de la subclase para comenzar, o determinar si el método debe estar también en la superclase.

16

Los otros ya han mencionado cómo lanzar objetos para obtener una respuesta a su pregunta, pero haciendo esa pregunta en primer lugar apunta a un posible problema de diseño. Algunas razones posibles:

+1

simplemente cámbiala a "posible problema de diseño" y estoy totalmente de acuerdo. – David

0

Otro enfoque podría ser la de hacer lo siguiente:

public abstract class Base { 

    //method() not implemented 

    public abstract void specialMethod(); 
} 

public class Subclass extends Base { 

    //method() not implemented 

    @Override 
    public void specialMethod() { 
     //put your code here 
     System.out.println("specialMethod from Subclass"); 
    } 
} 

lo que puede hacer:

thing.specialMethod(); 

y se le dará: "specialMethod de la subclase".

Cuestiones relacionadas