【发布时间】:2013-02-24 06:46:50
【问题描述】:
有一本书说有一个PhoneNumber 类,然后我们会定义一个继承自PhoneNumber 的Address 类,我曾经说过,我们不能这样做,因为地址不是电话号码,要继承,必须是“是”关系。如:狗是动物,我们可以让Dog继承自Animal。
但既然我们必须遵循LSP -- Liskov Substitution Principle,那么“是”规则实际上并不是这里的决定因素,因为正方形“是”矩形(宽度 == 高度),但 LSP 说我们可以' t 定义一个Square 类并从Rectangle 类继承。英文简单的解释,我想,是对象aRect可以响应消息setWidthAndHeight(w, h),但是aSquare不能正确响应,让整个程序正常运行。
令人惊讶的是,继承PhoneNumber 类的Address 类违反了“is a”关系,但并不违反LSP。那么正式地说,它违反了哪些 OOP 原则?
【问题讨论】:
-
它唯一违反的是常识,但在了解所有系统及其组件之前,不能仅根据 2 个对象来判断设计。
-
我认为 OOP 的 5 个原则:S.O.L.I.D.是我们不只是使用常识,为所欲为,而是遵循原则
-
在不了解更多细节的情况下很难回答这个问题,但如果
Address继承自PhoneNumber,它似乎有多个更改的理由,这违反了单一责任原则。此外,谁说 SOLID 是 OOP 的原则(考虑 GRASP、Demeter 法则、DRY、KISS)。 -
“THE”代表什么? :-)
-
@BobHorn It does。如果在
w不等于h时抛出异常,则表示您正在加强子类型中的前置条件,根据前置条件和后置条件的规则,这是不允许的(另一个参考:p. 7 of this ObjectMentor article)。
标签: oop object-oriented-analysis liskov-substitution-principle