来自名为 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
的地方使用 Properties
。 Stack
与 Vector
相同。
好的设计应该力求 API 的简单性。如果您正在设计一个Stack
,您基本上应该只提供push
和pop
方法。从 Vector
公开继承会泄露用户不需要知道的实现细节。除了困惑之外,这意味着您不能永远更改实现!因此,如果明天 Vector
被弃用(我相信此时确实如此),您仍然会被使用它的 Stack
困住,因为您的客户可能会期望它。更改实现会违反向后兼容性,这是另一个设计目标。
请注意,上面的示例不是随机的。 Vector
和 Hashtable
都是被认为已过时的类(请参阅最后的评论 here 和 here)。这些类有一些设计缺陷,已被 ArrayList
和 HashMap
或类似的其他类所取代。这也使得从它们继承的类也过时了。如果不是继承您使用的组合,您可以轻松地将 Vector
和 Hashtable
替换为它们的现代对应物,而不会影响任何用户。
另一方面,Set
是一个 Collection
。也就是说,如果某些代码指定它需要某种Collection
,则用户可以自由提供Set
(或List
或其他任何内容) ).如果对此集合应提供的内容没有特定要求(例如,没有随机访问),这会为 API 提供更大的灵 active 。
关于java - 参数 "Subclass Only Where It Makes Sense"的详细解释是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27406433/