Может ли родительский метод использовать метод Child Class?

Ссылка здесь

A - это прекомпилированный Java-класс (у меня также есть исходный файл) B - класс Java, который я создаю B расширяет A.

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

  • Я не хочу прикасаться к A (только как последний вариант, хотя это означает, что нет другое решение существует).
  • Я не хочу использовать отражение.

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

Ответы

Ответ 1

Класс A должен определять методы, которые он будет вызывать (возможно, как абстрактные, а A должен быть абстрактным классом, для Paul Haahr отлично guide); B может (на самом деле, быть конкретным ДОЛЖНЫ, если метод абстрактный) переопределить эти методы. Теперь вызовы этих методов из других методов в A, когда они происходят в экземпляре класса B, переходят к B-переопределениям.

Общая схема проектирования называется Template Method; методы, подлежащие переопределению, часто называются "методы крюка" и метод, выполняющий вызовы, "метод организации".

Ответ 2

Да, кажется, что если вы переопределите функции супер/базовые классы, вызовы этих функций в базовом классе перейдут к дочернему/производному классу. По-моему, это плохой дизайн, но там вы идете.

class Base
{
    public void foo()
    {
        doStuff();
    }
    public void doStuff()
    {
        print("base");
    }
}

class Derived extends Base
{
    @Override
    public void doStuff()
    {
        print("derived");
    }
}

new Derived().foo(); // Prints "derived".

Очевидно, что все методы Derived должны быть уже определены в Base, но делать это иначе (без интроспекции) было бы логически невозможно.

Ответ 3

Я бы довольно не решался это сделать. Пожалуйста, поправьте меня, если я ошибаюсь, а затем я удалю, но похоже, что вы хотите сохранить объект A вместе с B-объектом. Если они действительно не являются одним и тем же объектом, "связывание" (что научный термин) вам нужно будет сделать, это будет довольно уродливо.