Внедрение зависимостей и наследование в Java

#java #dependencies #code-injection #reusability

#java #зависимости #внедрение кода #возможность повторного использования

Вопрос:

У меня есть следующий код:

 public class GrandParent {    
    public void greet() {
        System.out.println("Hello from grandpa.");
    }    
}

public class Parent extends GrandParent {    
    public void run() {
        greet();
    }                   
}

public class RunMe {       
    public static void main(String args[]) {
        Parent p = new Parent();
        p.run();
    }

    public void greet() {
        System.out.println("Hi.");
    }    
}
  

Мне поручено написать класс RunMe и, насколько это возможно, мне не разрешено изменять классы Parent и GrandParent. Как я могу реализовать это таким образом, чтобы при выполнении функции run() родительского элемента выполнялась функция greet() RunMe (или это могло быть в другом месте), а не функция greet() дедушки и бабушки.

Или это возможно в первую очередь?

Комментарии:

1. Как здесь подходит внедрение зависимостей?

2. Вам вообще не разрешается изменять классы или «насколько это возможно» не изменять их? Можете ли вы отредактировать свой вопрос, чтобы сделать его более понятным? Спасибо.

Ответ №1:

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

Ответ №2:

Вы могли бы написать внутренний класс экземпляра (не статический) в RunMe, который расширяет Parent и переопределяет run() родительского экземпляра таким образом, что он выполняет вызов run() экземпляра RunMe. Ваш метод main() создаст экземпляр нового подкласса вместо родительского.

Ответ №3:

Во-первых, вам нужен экземпляр RunMe для вызова его run() метода, поскольку это не статический метод. Один из способов подключиться к тому, что происходит в Parent , — создать подкласс Parent :

 public static void main(String args[]) {
    final RunMe runMe = new RunMe();
    Parent p = new Parent() {
        public void run() {
            super.run(); // runs Parent.run()
            runMe.run(); // runs the hook function
        }
    };
    p.run();
}
  

Я понятия не имею, это ли то, что вам нужно.

Ответ №4:

попробуйте это:

 public class MyParent extends Parent {    
    @Override
    public void greet() {
        System.out.println("hello from MyParent");
    }                   
}

public class RunMe {       
    public static void main(String args[]) {
        Parent p = new MyParent();
        p.run();
    }
}
  

Ответ №5:

Я думаю, вы имели в виду это:

 public class RunMe extends Parent {
    public static void main(String args[]) {
        Parent p = new RunMe();
        p.run();
    }

    public void greet() {
        System.out.println("Hi.");
    }
}