Выполнить метод дочернего класса

135
14 ноября 2019, 13:10

Есть родительский класс,который является абстракцией при создании экземпляров дочерних классов. Как можно с инстанса родителя, получить доступ к методам дочернего класса?

class A {
 //some code
}
class B extends A {
 private int i = 10;
 public void go() {
  //some code
 }
}

Main class:

A a = new B();
a.go();//error
Answer 1

Привести тип переменной к дочернему классу:

A a = new B();
((B) a).go();

Проблема в том, что переменная может хранить объект класса A и других его наследников, у которых метода go не будет. Поэтому может потребоваться сначала проверить содержит ли переменная объект нужного класса:

if(a instanceof B) {
    B b = (B) a;
    b.go();
}

А вообще сам факт того что Вам понадобилось приведение типов это повод задуматься и поработать над логикой кода. Почему переменная объявлена с типом A? Всегда ли там будет объект класса B? Не нужно ли перенести метод в родительский класс? Не лучше ли создать метод в A и переопределить его поведение в B?

Answer 2

Если все дочерние классы имеют такой метод то можно задекларировать его в базовом классе.

abstract class A {
    public abstract void go();
} 
Answer 3

Если в классе A нет метода, то вызвать из него метод другого класса нельзя. Но если добавить метод с такой же сигнатурой и возвращаемым значением в класс A, то в B этот метод будет перекрыт, и следовательно вызываться благодаря полиморфизму. Метод и класс A можно сделать абстрактным, если нет общей имплементации по умолчанию для подклассов, и следовательно подклассам придётся писать свою имплеметацию. Если класс А не абстрактный, но содержит метод, который перекрыт в подклассе, то вызов метода будет происходить из подкласса, благодаря тому же полиморфизму, но подклассы в этом случае не обязаны имплементировать или перекрывать общий метод, который будет иметь имплементацию по умолчанию.

Для более лучшего понимания абстрактных классов можно почитать этот ответ.

READ ALSO
Telegram bot Java

Telegram bot Java

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

131
не запускается javaFX jar-ник

не запускается javaFX jar-ник

Сделал два эксперимента с использованием javaFx и Swing где оба этих проекта заворачиваю в банку (Eclipse)первым экспортировал Swing проект по двойному...

156
Зацикленность Java

Зацикленность Java

Не понимаю почему цикл зацикливается, объясните пожалуйста

149
onsubmit+onclick в связке

onsubmit+onclick в связке

У меня есть формы и все они работают через onsubmit с одним и тем же скриптом На одну из форм мне нужно было сделать так, что бы при нажатии на кнопку,...

113