里氏替换原则 L
iskov Substitution Principle
里氏替换原则是指任意父类,都可以用它的子类来替换,而且不会出现异常或者错误的结果。
关于里氏替换原则比较经典的例子是矩形和正方形的例子。
class Rectangle def initialize(width, length) @width = width @length = length end def caculate_area @width * @length end end class Square < Rectangle def initialize(length) @width = length @length = length end end
假如说我们有段代码:
rec = Rectangle.new(5, 4) rec.caculate_area #=> 20
但是如果我们用它的子类,Square来替换Rectangle的时候,我们程序就会报错。
这意味着我们违反了里氏替换原则。所以说这样的抽象是不正确的抽象。
正确的抽象可以让Rectangle 和Square都继承于某个类,比如说类Shape. 为了让我们的类Shape看上去更有用,我故意增加了一个方法,inspect。
class Shape def inspect puts "I am a #{self.class}." end end class Rectangle < Shape attr_accessor :width, :length def caculate_area @width * @length end end class Square < Shape attr_accessor :width def caculate_area @width ** 2 end end
可能很多同学会问,这个原则的意义在哪?这个原则的意义在于,遵守里氏替换原则,有助于我们遵守开关原则