gpt4 book ai didi

java - 多态性/动态绑定(bind)、父类(super class)或接口(interface)?

转载 作者:行者123 更新时间:2023-11-29 03:44:51 26 4
gpt4 key购买 nike

如果我有几个子类型,每个子类型都继承一个抽象父类(super class)并且这个父类(super class)实现了一个接口(interface)——当实现动态绑定(bind)/多态性时,将对象声明为父类(super class)类型与接口(interface)类型之间有什么区别吗?

所以 A、B、C、D 从 S 扩展,S 实现 I。

我能做到:

S a = new A();
S b = new B();

I a = new A();
I b = new B();

我倾向于使用接口(interface),但我突然想知道使用父类(super class)是否更好,以防您将接口(interface)拆分为两个接口(interface)....

最佳答案

从打字的角度来看,没有区别。 (除非您通过使用反射在运行时内省(introspection)类型来专门“去寻找”......)

从运行时性能的角度来看,没有区别。 (除了在加载类的时间上可能存在一些非常小的差异......在所有实际用例中都可以忽略。)

从代码实现的角度来看,两种方式各有优缺点:

如果您只使用父类(super class)(不使用接口(interface)),您可以编写更少的代码。但不利的一面是您的代码不太灵活:

  • 您正在以限制您编写新实现的能力的方式尝试实现外部 API。 java.io.OutputStream 类就是一个典型的例子。因为它是一个类,所以您必须创建一个子类才能实现新的流类型,并且您可能会发现您必须编写子类代码以覆盖您“继承”的所有基础设施。

  • 一个类只能有一个父类(super class)这一事实进一步限制了您只能使用树形 API 层次结构。

  • 客户端必须在更大程度上针对实现类 API 进行编码……因为仅此而已。这限制了程序员改变主意的能力。


底线:如果特定用例不要求您能够执行这些操作(现在或将来),那么使用接口(interface)没有任何好处。但是很少有用例真的是这样的。而且使用接口(interface)的增量实现工作量很小。


I should add, I am not asking whether or not to use interfaces. I am guessing interfaces can be used just to force somebody to implement methods (and never declared as a type)?

嗯,是的。但是抽象方法也可以。这不是使用接口(interface)的真正意义。真正的重点是接口(interface):

  • 允许使用类可能实现的更丰富的类型层次结构,并且
  • 允许独立于实现类编写客户端代码。

I am just asking what benefits does using the interfaces as the object type bring for polymorphism?

从打字和性能水平来看:无 - 见上文。

我想,您可能会争辩说,如果您以跨越实现层次结构的方式使用接口(interface),那么您在客户端级别将拥有更大的灵 active 。我想您可以称其为“多态性的好处”。 (相比之下,如果您的接口(interface)层次结构完全反射(reflect)了您的实现类层次结构,那么您可能没有取得任何成就……至少就编写的代码而言。)

但是,多态性是达到目的的一种手段,本身并不是目标,所以我认为从抽象意义上询问“多态性的好处”是没有捕获要点的。真正的重点是以有意义的方式设计和实现程序,并产生可维护的代码。

关于java - 多态性/动态绑定(bind)、父类(super class)或接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11480166/

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