有一本书说有一个PhoneNumber
类,然后我们会定义一个Address
继承自的类,PhoneNumber
我曾经说过,我们不能这样做,因为地址不是电话号码,并且要继承,它必须是“是”关系。如:狗是一种动物,我们可以Dog
继承自Animal
.
但是既然我们必须遵循LSP -- Liskov Substitution Principle,那么“是一个”规则实际上并不是这里的决定因素,因为一个正方形“是一个”矩形(宽度 == 高度),但是 LSP 说我们可以' t 定义一个Square
类并从该类继承Rectangle
。简单的英文解释,我想,就是对象aRect
可以响应消息setWidthAndHeight(w, h)
,但aSquare
不能正确响应,让整个程序正常运行。
如此令人惊讶的是,Address
继承类的PhoneNumber
类违反了“is a”关系,但并不违反 LSP。那么正式地,它违反了哪些 OOP 原则?