Liskov的替代原则是否与开放/封闭原则冲突?

问题描述 投票:2回答:1

今天有人问我李斯科夫的替代原则与开放/封闭原则有何冲突?

是否与使用OC原理扩展父类,然后不能代替Liskov原理来代替?

oop solid-principles
1个回答
0
投票

假设您有一个包含具有某些功能的类A的库,并且您想更改该类(的一部分)的行为。

如果您要遵循“打开/关闭”原则,则应创建一个派生自A且行为不同的子类(因为该原则禁止您更改A类)

如果您希望遵循Liskov原则,则不允许创建行为不同的子类,因此应更改原始类。

这意味着在这种情况下不可能同时遵守这两个原则。

示例

类'StorageController'具有一个Store()函数,该函数将您的项目存储为XML文件。现在,您想更改它,以便它存储一个JSON文件。

[打开/关闭原则说,您必须创建一个子类'JsonStorageController',该子类将覆盖此方法以存储json而不是xml。但是,这违反了Liskov原理,因为不能简单地用JsonStorageController替换StorageController。

当然,还有其他解决方案不会违反这些原则,例如,重写基类并添加一个额外的方法'StoreToJson',但是这些解决方案可能会破坏其他原则,例如,单一职责原则(给出两种不同的子类的责任)。

© www.soinside.com 2019 - 2024. All rights reserved.