【问题标题】:Dependency injection and Inheritance in JavaJava中的依赖注入和继承
【发布时间】:2011-12-24 04:18:13
【问题描述】:

我有以下代码:

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。我如何以这样一种方式实现这一点,即当执行到达 Parent 的 run() 时,RunMe 的 greet()(或者它可能在另一个地方)被执行,而不是 GrandParent 的 greet()。

或者这首先是可能的吗?

【问题讨论】:

  • 依赖注入在这里如何适应?
  • 您是完全不允许修改类还是“尽可能”不修改它们?您可以编辑您的问题以使其更清楚吗?谢谢。

标签: java dependencies code-injection reusability


【解决方案1】:

如果您要让非扩展的 Parent 对象调用不同的 greet 方法而不更改 Parent 或 Grandparent 代码,我看不出这是怎么可能的。

【讨论】:

    【解决方案2】:

    您可以在 RunMe 中编写一个实例(非静态)内部类,它扩展 Parent 并覆盖 Parent 实例的 run(),以便调用 RunMe 实例的 run()。您的 main() 方法将创建新子类的实例而不是 Parent。

    【讨论】:

      【解决方案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.");
              }
          }   
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-28
            • 1970-01-01
            • 2021-04-16
            • 1970-01-01
            • 1970-01-01
            • 2017-05-24
            相关资源
            最近更新 更多