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
Respuesta
Si sabe que contiene una thing
Subclass
, que puede hacer:
((Subclass) thing).specialMethod()
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
Usted tiene que escribir, o lanzas cosa a la subclase. Por lo tanto:
Subclass thing = new Subclass();
o:
((Subclass) thing).specialMethod();
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.
Esa declaración 'if' probablemente debería tener' else' ... –
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.
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:
- El método está en el lugar equivocado.
- El código que llama al método está en el lugar incorrecto.
- La subclase no debe extender la otra clase. Lo mejor es prefer composition over inheritance. Y al heredar, el código debe seguir el Liskov substitution principle.
- Las clases son non-cohesive, tienen más de one responsibility, y deben dividirse en varias clases.
simplemente cámbiala a "posible problema de diseño" y estoy totalmente de acuerdo. – David
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".
- 1. Llamar a un método de subclase de la superclase
- 2. ¿Cómo llamar a un método en Java?
- 3. acceso a método denegado al llamar al método protegido de la subclase java
- 4. llamar a otro método en el principal método en Java
- 5. Cómo forzar a la subclase a llamar a un método abstracto implementado
- 6. Llamar a un método genérico por reflejo en java
- 7. Java: Anulando un método abstracto en la subclase
- 8. Llamar a cualquier método Java desde C#
- 9. Llamar a un método genérico java sobrecargada de Scala
- 10. Llamar a un método Java estática protegido de Scala
- 11. Llamar a un método NSTimer
- 12. ¿Puede un método nativo llamar a un método privado?
- 13. Android/Java: ¿Llamar a un método usando la reflexión?
- 14. Llamar a un Método Java desde Visual Basic 6
- 15. Llamar a un método en Constructor
- 16. Llamar a un método estático en C#
- 17. Llamar a un método súper en PHP
- 18. ¿Cómo puedo llamar a un método en un objeto nulo?
- 19. Llamar a un método asíncrono de un método no asíncrono
- 20. Llamar a un método de otro controlador
- 21. Llamar a un método anulado, superclase a llamadas reemplazadas método
- 22. Java - Alternativas a la subclase obligando a tener un método estático
- 23. Llamar a un método cada vez antes de llamar a cualquier otro método
- 24. Llamar a un método genérico con un método genérico
- 25. Llamando a un método java en jsp
- 26. Llamar a un método en un módulo de Rubí
- 27. Cómo llamar a un método en un objeto de javascript
- 28. Llamar a un método en un modelo de controlador
- 29. Llamar a un método como un método de extensión requiere más referencia que llamar directamente
- 30. ¿Puedo llamar económicamente a un método de Java para obtener el nombre del método actual?
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. –