【发布时间】:2010-06-28 17:22:20
【问题描述】:
通常我们在事件监听中也使用接口概念来实现 RMI,我们使用接口。为什么我们不能在这两种情况下使用抽象类。
【问题讨论】:
通常我们在事件监听中也使用接口概念来实现 RMI,我们使用接口。为什么我们不能在这两种情况下使用抽象类。
【问题讨论】:
因为 RMI 需要在运行时使用 JRE 的代理生成逻辑生成实现这些接口的存根和骨架类。这不适用于抽象类,因此所有 RMI 操作都必须定义为接口。
【讨论】:
对于事件:因为正常情况是我们有自己的实现类,它可能需要监听几个不同的事件;我们不能扩展两个不同的抽象类。
Skaffman 已经解释了在 RMI 中使用抽象类的一个问题。我会更进一步,抽象类对于这个目的来说是完全错误的概念。服务提供者需要向其客户提供有关如何调用服务的信息。接口正是我们所需要的——它告诉客户端什么可以完成,而没有关于如何完成。当我们给出一个抽象类时,我们包括(部分)实现信息。客户端不需要看到这一点,并且在 RMI 连接中甚至可能无法编译它 - 服务器中的抽象类可能引用客户端甚至没有的类。当然,您可以删除客户不需要的所有东西,所有实现等,瞧!您返回的只是界面中所需的信息。
所以我的做法:
定义我的接口,我与外界的合同。
如果我可能有该接口的多个实现,特别是如果我想帮助实现者,请定义一个实现该接口的抽象类。在该抽象类中包含通用的实现代码,并留下一些抽象的方法供实现者实际填写。
或者简单地说:客户端的接口,实现者的抽象类,您可以选择同时使用两者。是的,这确实意味着一些重复,这就是我们拥有出色 IDE 的原因。
【讨论】: