【问题标题】:The Liskov substitution principle里氏替换原则
【发布时间】:2020-04-05 21:51:43
【问题描述】:

我正在阅读 Chetan Giridhar 撰写的《学习 Python 设计模式》一书 我遇到了一个叫做 Liskov 替换原则的设计原则,它指出 派生类必须能够完全替代基(父)类。

我想我不明白这一点,因为编写派生类有什么意义 如果它可以完全取代基类?不会让基类变得多余吗?

根据我的理解和经验,派生类扩展了基类的功能,因此应该依赖于基类。

作者试图帮助我理解什么?

【问题讨论】:

  • 问题是,派生类可以在任何使用基类的地方使用。通过继承,您仍然可以使用自己的代码覆盖继承的方法。该规则基本上表明您的重写方法仍应以预期的方式运行,而不是做完全不同的事情 - 因此,当您在预期基类的地方使用派生类实例时(因为派生类实例仍然是基类的实例) ,它按预期工作。
  • 如果我理解正确,作者的意思是派生类不应该改变从基类继承的方法的功能。这对我来说很有意义,因为如果你用这样的类替换基类,其他派生类就会中断。另外,你总是可以装饰有问题的方法。装饰器改变方法的行为方式。
  • “替换”在这里只是意味着子类应该模仿基类的 API,使子类实例在任何需要基类对象的地方工作。但是子类仍然可以添加其他行为或修改现有行为,使其与基类不同,因此是非冗余的。

标签: python oop liskov-substitution-principle


【解决方案1】:

Derived 类应该在不替换旧类的functionality 的情况下进行扩展。这意味着派生类应该可以替代它们的parent/base 类。此外,它们可以代替其父类使用,而不会出现任何意外行为。

我们无法替换 parent class's 功能,但我们可以在子类中 re-write 它并修改 extend 该子类。通过更改父类,它将使我们远离复杂软件中可能出现的chain reaction,因此我们在子类中选择duplicate,然后选择write我们想要的modifications

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多