java - 参数 "Subclass Only Where It Makes Sense"的详细解释是什么?

标签 java inheritance subclass api-design

来自名为 How to Design a Good API and Why it Matters 的演示文稿

我卡在了演示文稿的第 25 页,其中说:

Public classes should not subclass other public classes for ease of implementation

它给了我们一个示例(Java 语法):

Bad:    Properties extends Hashtable 
        Stack extends Vector

Good:   Set extends Collection

但为什么这些例子有好有坏?

最佳答案

因为 Properties 不是 Hashtable,它们不应该互换使用,即,您不希望用户在只需要 Hashtable 的地方使用 PropertiesStackVector 相同。

好的设计应该力求 API 的简单性。如果您正在设计一个Stack,您基本上应该只提供pushpop 方法。从 Vector 公开继承会泄露用户不需要知道的实现细节。除了困惑之外,这意味着您不能永远更改实现!因此,如果明天 Vector 被弃用(我相信此时确实如此),您仍然会被使用它的 Stack 困住,因为您的客户可能会期望它。更改实现会违反向后兼容性,这是另一个设计目标。

请注意,上面的示例不是随机的。 VectorHashtable 都是被认为已过时的类(请参阅最后的评论 herehere)。这些类有一些设计缺陷,已被 ArrayListHashMap 或类似的其他类所取代。这也使得从它们继承的类也过时了。如果不是继承您使用的组合,您可以轻松地将 VectorHashtable 替换为它们的现代对应物,而不会影响任何用户。

另一方面,Set 是一个 Collection。也就是说,如果某些代码指定它需要某种Collection,则用户可以自由提供Set(或List 或其他任何内容) ).如果对此集合应提供的内容没有特定要求(例如,没有随机访问),这会为 API 提供更大的灵 active 。

关于java - 参数 "Subclass Only Where It Makes Sense"的详细解释是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27406433/

相关文章:

java - 如何使用嵌套循环先向上再向下计数?

java - 我在java中的For循环做错了什么?

c# - 需要领域建模建议 - 希望是常见场景

C# 继承 - 为什么使用覆盖和虚拟?

java - Java 中的继承与多态

ios - Swift 如何在编译时解决这个问题?

NHibernate 仅对子类使用 FetchMany 进行预加载

java - 如何避免按下 ALT 键使我的 GUI 失去焦点

java - While 循环不能正常工作?

java - 使用反射获取方法;找不到接口(interface)类型的方法参数