gpt4 book ai didi

通过在运行时注入(inject)实现 Java 多态性

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:09 25 4
gpt4 key购买 nike

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

class MyClass extends Parent implements Naming

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

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

最佳答案

So I know about polymorphism through interface and and extension such as

class MyClass extends Parent implements Naming

这被称为继承而不是多态。 MyClass 是一个ParentMyClass 也是一个Naming。也就是说,继承 允许您实现多态性

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

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

}
}

现在考虑一个方法,该方法在您的代码库中的某处采用 Naming 参数:

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

doSomething 方法可以传递任何实现Naming 的实例。所以以下两个调用都是有效的:

doSomething(new MyClass());//1
doSomething(new SomeOtherClass());//2

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

But I don't get how injection works. The idea is that I would not be using the @Override keyword during injection

从广义上讲,这是正确的。要将某些东西注入(inject)到一个类中,理想情况下该类应该倾向于组合而不是继承。参见 this答案很好地解释了支持组合而不是继承的原因。

为了从我的回答中扩展上面的例子,让我们修改 doSomething 方法如下:

  public class ClassHasANaming {
private Naming naming;

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

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

观察 ClassHasANaming 现在如何拥有一个可以从外部注入(inject)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 在编译时本身绑定(bind)到 someMethodDefinedInTheInterface 方法的单个实现。 `

关于通过在运行时注入(inject)实现 Java 多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30817523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com