我听说在Java中,可以在运行时通过注入实现多态。有人可以举一个简单的例子来说明如何做到吗?我在网上搜索,但找不到任何内容:也许我搜索错了。所以我通过接口和扩展了解多态,例如

class MyClass extends Parent implements Naming

在这种情况下,我两次实现了多态性:MyClass同时为ParentNaming类型。但是我不知道注射是如何工作的。这个想法是,在注入期间我不会使用@Override关键字。我希望问题清楚。谢谢。

因此,根据我的理解,这里的最终结果是通过注入而不是在开发过程中通过@Override更改方法的行为。

最佳答案

所以我通过接口和扩展了解多态,例如

class MyClass extends Parent implements Naming
这被称为继承而不是多态。 MyClassParent,而MyClass也是Naming。就是说,inheritance允许您达到polymorphism

考虑一个除了MyClass之外的类,它也实现了Naming:

class SomeOtherClass implements Naming {
     @Override
     public void someMethodDefinedInTheInterface() {

     }
 }

现在考虑在代码库中某处采用Naming参数的方法:
public void doSomething(Naming naming) {
     naming.someMethodDefinedInTheInterface();
}

可以将实现doSomething的任何class的实例传递给Naming方法。因此,以下两个调用均有效:
doSomething(new MyClass());//1
doSomething(new SomeOtherClass());//2

观察如何使用不同的参数调用doSomething。在运行时,第一个调用将从someMethodDefinedInTheInterface调用MyClass,第二个调用将从someMethodDefinedInTheInterface调用SomeOtherClass。这就是runtime-polymorphism,可以通过继承来实现。

但是我不知道注射是如何工作的。这个想法是我不会在注入过程中使用@Override关键字

从广义上讲是正确的。要将inject放入类中,理想情况下,该类应优先于composition而不是inheritance。请参阅this答案,它很好地解释了赞成使用组合而不使用继承的原因。

为了从我的答案中扩展上述示例,让我们如下修改doSomething方法:
  public class ClassHasANaming {
      private Naming naming;

      public ClassHasANaming(Naming naming) {
          this.naming = naming;
      }

      public void doSomething() {
           naming.someMethodDefinedInTheInterface();
      }
  }

观察ClassHasANaming现在如何具有Naming依赖性,可以将从外界注入:
ClassHasANaming callMyClass = new ClassHasANaming(new MyClass());
callMyClass.doSomething();

如果使用Factory pattern,则实际上可以选择在运行时实例化哪个子类。

您认为我们可以使用inheritance完成上面的操作吗?
 public class ClassIsANaming implements Naming {
    public void doSomething() {
        someMethodDefinedInTheInterface();
    }

    @Override
    public void someMethodDefinedInTheInterface() {
        //....
    }
 }

答案是ClassIsANaming在编译时本身绑定到someMethodDefinedInTheInterface方法的单个实现。
`

09-30 15:18