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