通过运行时注入实现Java多态性
我听说在Java中,我可以在运行时通过注入实现多态性。有人能举一个简单的例子说明这是如何做到的吗?我在网上搜索,但什么也找不到:也许我搜索错了。所以我通过接口和扩展了解多态性,比如
class MyClass extends Parent implements Naming
在这种情况下,我实现了两次多态性:MyClass同时是Parent
和Naming
类型。但我不明白注射是怎么起作用的。这个想法是,在注入期间,我不会使用@Override
关键字。我希望问题是清楚的。谢谢
因此,根据我的理解,这里的最终结果是通过注入来改变方法的行为,而不是在开发过程中通过@Override
改变方法的行为
# 1 楼答案
这被称为遗传性,而不是多态性
MyClass
是Parent
,而MyClass
也是Naming
。也就是说,inheritance
允许你实现polymorphism
考虑除^ {< CD1>}之外的类,也实现^ {CD4>}:
现在考虑一个在代码库中某个地方使用^ {< CD4>}参数的方法:
可以向
doSomething
方法传递实现Naming
的任何class
的实例。因此,以下两个调用都是有效的:观察如何使用不同的参数调用
doSomething
。在运行时,第一个调用将从MyClass
调用someMethodDefinedInTheInterface
,第二个调用将从SomeOtherClass
调用someMethodDefinedInTheInterface
。这被称为runtime-polymorphism
,可以通过继承来实现从更广泛的意义上说,这是正确的。为了把某物
inject
放入一个类中,理想情况下,类应该倾向于composition
而不是inheritance
。参见this答案,它很好地解释了支持组合而非继承的原因为了从我的答案中扩展上述示例,让我们修改
doSomething
方法如下:观察一下
ClassHasANaming
现在如何有一种Naming
依赖性,这种依赖性可以从外部世界注入:如果使用Factory pattern,实际上可以选择在运行时实例化哪个子类
你认为我们可以用
inheritance
完成上面的工作吗答案是否定的
ClassIsANaming
在编译时本身绑定到someMethodDefinedInTheInterface
方法的单个实现。 `# 2 楼答案
举一个人为的例子。你有一个类
Store
存储东西:您可以使用
setStoreProvider
注入用作备份存储的实际List
,它可以是链表、数组备份列表等等因此,根据注入的类型,你的
Store
类将具有注入类型的特性(关于内存使用、速度等)这是一种没有类实现接口的多态性