我听说在Java中,可以在运行时通过注入实现多态。有人可以举一个简单的例子来说明如何做到吗?我在网上搜索,但找不到任何内容:也许我搜索错了。所以我通过接口和扩展了解多态,例如
class MyClass extends Parent implements Naming
在这种情况下,我两次实现了多态性:MyClass同时为
Parent
和Naming
类型。但是我不知道注射是如何工作的。这个想法是,在注入期间我不会使用@Override
关键字。我希望问题清楚。谢谢。因此,根据我的理解,这里的最终结果是通过注入而不是在开发过程中通过
@Override
更改方法的行为。 最佳答案
所以我通过接口和扩展了解多态,例如
class MyClass extends Parent implements Naming
这被称为继承而不是多态。 MyClass
是Parent
,而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
方法的单个实现。`