知识卡片
契约替换
内容
可替换性要求新实现遵守原接口承诺,让调用方无需察觉变化。继承只有在真正的 is-a 关系下才合适,许多扩展更适合委托。发散:灵活系统靠清晰契约变强,不靠继承层级变深。
参考来源
- 位置:第6章《敏捷编码》"32 根据契约进行替换"(源文件:_epub-src/OEBPS/text00000.html)
- 结论依据:原文引用Liskov替换原则"任何继承后得到的派生类对象,必须可以替换任何被使用的基类对象,而且使用者不必知道任何差异",用java.util.Stack违反该原则导致元素被以错误顺序插入删除为反例,并明确"针对is-a关系使用继承;针对has-a或uses-a关系使用委托",直接支持卡片结论。
- 原始内容:"Liskov替换原则告诉我们:任何继承后得到的派生类对象,必须可以替换任何被使用的基类对象,而且使用者不必知道任何差异。……要遵守Liskov替换原则,相对基类的对应方法,派生类服务(方法)应该不要求更多,不承诺更少……针对is-a关系使用继承;针对has-a或uses-a关系使用委托……通过替换代码来扩展系统。通过替换遵循接口契约的类,来添加并改进功能特性。要多使用委托而不是继承。"