【发布时间】:2020-04-05 21:51:43
【问题描述】:
我正在阅读 Chetan Giridhar 撰写的《学习 Python 设计模式》一书 我遇到了一个叫做 Liskov 替换原则的设计原则,它指出 派生类必须能够完全替代基(父)类。
我想我不明白这一点,因为编写派生类有什么意义 如果它可以完全取代基类?不会让基类变得多余吗?
根据我的理解和经验,派生类扩展了基类的功能,因此应该依赖于基类。
作者试图帮助我理解什么?
【问题讨论】:
-
问题是,派生类可以在任何使用基类的地方使用。通过继承,您仍然可以使用自己的代码覆盖继承的方法。该规则基本上表明您的重写方法仍应以预期的方式运行,而不是做完全不同的事情 - 因此,当您在预期基类的地方使用派生类实例时(因为派生类实例仍然是基类的实例) ,它按预期工作。
-
如果我理解正确,作者的意思是派生类不应该改变从基类继承的方法的功能。这对我来说很有意义,因为如果你用这样的类替换基类,其他派生类就会中断。另外,你总是可以装饰有问题的方法。装饰器改变方法的行为方式。
-
“替换”在这里只是意味着子类应该模仿基类的 API,使子类实例在任何需要基类对象的地方工作。但是子类仍然可以添加其他行为或修改现有行为,使其与基类不同,因此是非冗余的。
标签: python oop liskov-substitution-principle