Вызов метода подclassа в Java

Если у меня есть базовый class Base thing = null; из которых есть class Subclass extends Base подclassа class Subclass extends Base и я провожу его как thing = new Subclass как бы я вызвал метод, который специально находится в подclassе, но не в Base? ех. Base имеет только method() Subclass есть method() и specialMethod() метод specialMethod() – тот, который я хочу вызвать.

Другие уже упомянули, как бросать объекты, чтобы получить ответ на ваш вопрос, но задание этого вопроса в первую очередь указывает на возможную проблему дизайна. Возможные причины:

  • Метод находится не в том месте.
  • Код, вызывающий метод, находится не в том месте.
  • Подclass не должен распространять другой class. Лучше предпочесть композицию над наследованием . А при наследовании код должен следовать принципу подстановки Лискова .
  • Классы несовместимы , у них более одной ответственности , и они должны быть разделены на несколько classов.

Если вы знаете, что эта thing содержит Subclass , вы можете сделать следующее:

 ((Subclass) thing).specialMethod() 

Вы должны cast его для вызова метода:

 Base thing = new SubClass(); ((SubClass) thing ).specialMethod(); 

Если вы столкнулись с такой ситуацией, скорее всего, у вас нет правильного интерфейса (правильный набор методов)

Прежде чем углубиться в стадию, когда вы начнете проверять все, чтобы узнать, можете ли вы вызвать метод или нет, как в:

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

Рассмотрите, если вам не нужно перемещать specialMethod вверх в иерархии, чтобы он принадлежал базе.

Если вам определенно не нужно это в базе, но вам нужно это в подclassе, по крайней мере, подумайте о правильном типе:

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

Но, как всегда, это зависит от того, что вы пытаетесь сделать.

Когда вы работаете с наследованием / polymorphismом в Java, в основном вы видите два типа бросков:

Приведение к базовому типу:

 Superclass x = new Subclass(); 

Это неявно и не требует жесткого броска, потому что Java знает, что все, что может сделать Superclass может выполнять и Subclass .

понижающее приведение

 Superclass x = new Subclass(); Subclass y = (Subclass) x; 

В этом случае вам нужно сделать жесткий бросок, потому что Java не совсем уверен, будет ли это работать или нет. Вы должны успокоить его, сказав ему, что вы знаете, что делаете. Причина этого в том, что в подclassе могут быть какие-то странные методы, которых нет в суперclassе.

В общем случае, если вы хотите создать экземпляр classа для вызова чего-либо в своем подclassе, вы должны, скорее всего, просто создать экземпляр подclassа для начала – или определить, должен ли этот метод также находиться в суперclassе.

Вы должны ввести или придать предмету подclassу. Так:

  Subclass thing = new Subclass(); 

или:

  ((Subclass) thing).specialMethod(); 

Другой подход может заключаться в следующем:

 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"); } } 

Таким образом, вы можете:

 thing.specialMethod(); 

и он даст вам: «specialMethod from Subclass».

Interesting Posts
Давайте будем гением компьютера.