Вызовите метод подкласса в Java - PullRequest
14 голосов
/ 23 апреля 2010

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

Ответы [ 6 ]

16 голосов
/ 23 апреля 2010

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

15 голосов
/ 23 апреля 2010

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

((Subclass) thing).specialMethod()
9 голосов
/ 23 апреля 2010

Вам нужно cast, чтобы вызвать метод:

Base thing = new SubClass();

((SubClass) thing ).specialMethod();

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

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

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

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

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

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

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

3 голосов
/ 23 апреля 2010

Когда речь идет о наследовании / полиморфизме в Java, вы видите в основном два типа приведений:

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

Superclass x = new Subclass();

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

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

Superclass x = new Subclass();

Subclass y = (Subclass) x;

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

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

1 голос
/ 14 июня 2017

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

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();

и он выдаст вам «специальный метод из подкласса».

1 голос
/ 23 апреля 2010

Вы должны напечатать или привести вещь к подклассу. Итак:

      Subclass thing = new Subclass();

или

     ((Subclass) thing).specialMethod();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...