开放继承

2006年8月21日

这与 设计继承 的态度相反。开放继承的倡导者不希望通过 密封 类或采取其他措施来阻止人们继承类。

开放继承的拥护者并不反对设计继承的拥护者关于继承的危险性的观点。继承是一种亲密的关系,对于不小心的人来说充满了危险。你很容易破坏超类的行为,而且你必须特别小心升级,因为你可能依赖于隐藏的实现细节。但开放继承者认为,是否承担这些风险应该由库的用户来决定。如果他们选择继承,那么他们就接受了风险和后果。

设计方法在理论上更好,但问题是很难找出人们可以有效地改变现有类的所有方法。这会导致两个问题:库用户无法以设计者没有预料到的方式使用库,而库设计者必须承担试图预测扩展的责任。

设计继承假设库编写者比他们的用户更明智。这通常不是这种情况。库编写者也会犯错误,如果继承是开放的,那么类的用户就有机会修复它们,并仍然利用库编写者的辛勤工作。

为继承而设计是一项非常棘手的任务,尤其是在你通常不知道用例的情况下。要求人们考虑所有继承情况会给库编写者带来很大的负担。开放继承意味着他们不必处理它,除非他们特别想要,前提是那些继承的人必须小心他们正在做什么。

设计继承特别容易出现问题的一个领域是测试。在测试中,你通常需要使用 测试替身,但被一个没有你可以用来替换的接口的密封类阻止了。这些类型的 API 可能 难以测试

开放继承者通常会设计带有预期扩展点的类,这些扩展点比其他扩展点更安全。但是,他们通常通过命名或文档来标记这些扩展点,而不是密封它们。这样,人们就可以被引导到安全区域,但如果需要,也不会被阻止在其他地方覆盖。

设计继承通常伴随着一种 指导性态度,这种态度通常忘记了愚蠢的人在搞砸事情方面是多么有创意。