今天有人问我,利斯科夫的替代原则如何与开放/封闭原则冲突,有什么想法吗?
这是否与用OC原则扩展父类,然后不能作为Liskov原则的替代品有关?
发布于 2020-01-09 17:11:58
假设您有一个库,其中包含一个具有某些功能的类A,并且您想要更改该类的行为(其中的一部分)。
如果你想坚持打开/关闭原则,你应该创建一个从A派生的子类,它的行为不同(因为这个原则禁止你改变类A)
如果您想坚持Liskov原则,则不允许创建具有不同行为的子类,因此您应该更改原始类。
这意味着在这种情况下同时遵守这两个原则是不可能的。
示例
“StorageController”类有一个函数Store(),它将项目存储为XML文件。现在,您想要更改它,使其存储一个JSON文件。
开放/关闭原则指出,你必须创建一个子类'JsonStorageController‘,它覆盖了这个方法来存储json而不是xml。然而,这违反了利斯科夫原则,因为JsonStorageController不能简单地替换StorageController。
当然,还有其他解决方案不会违反这些原则,例如覆盖基类并添加额外的方法“StoreToJson”,但是这些可能会违反其他原则,例如单一责任原则(赋予子类两个不同的责任)。
https://stackoverflow.com/questions/59656024
复制相似问题