里氏替换原则疑问:子类新增属性是否违反该原则?
里氏替换原则与继承设计问题解答
里氏替换原则的核心不是强制子类成员放基类
里氏替换原则(LSP)的核心是子类能无缝替换基类的所有使用场景,且不搞乱原有逻辑,它完全没有要求引用其他类的成员必须定义在基类里。基类只该放所有子类共有的属性和行为,子类完全可以有自己独有的特性,只要这些特性不会让子类在替换基类时出问题。
你的代码继承设计没问题
先看给出的代码:
abstract Location // 设施里的地点 { public string Name; } Warehouse:Location { public int Capacity; public TypeOfProduct Product; ///--- 这个该放基类吗?那继承Location是不是不合适? }
- 继承关系合理:仓库(Warehouse)本来就是一种地点(Location),符合"is-a"的继承逻辑,没毛病。
- Product绝对不该放基类:不是所有地点都需要关联产品,比如设施里的办公室、休息室这些地方,根本不需要Product属性。要是硬把它塞到基类,那些不需要的子类就得被迫继承这个多余的属性,既不符合业务逻辑,还违反里氏替换原则——用Location类型变量引用这些子类时,平白多出个没用的属性,很容易导致逻辑混乱。
所以你的代码设计是对的,Warehouse保留自己独有的Capacity和Product属性完全符合设计原则。
内容的提问来源于stack exchange,提问作者Artur
相关产品推荐
相关产品推荐

