#3固体 - Liskov替代原则| Swift | iOS开发
#发展 #ios #swift

lsp指出,超级类的对象应被其子类的对象替换而不影响程序的正确性-Barbara Liskov(1987)

在下面的示例中,

  • 我们有一个代表不同形状的类层次结构:超级类Shape和两个子类,RectangleCircle
  • Shape类充当一个超类,定义了使用area()方法的常见接口。
  • 矩形和圆形子类都从形状继承并提供自己的区域()方法的实现。
class Shape {
    func area() -> Double {
        fatalError("Subclasses must override area() method.")
    }
}

class Rectangle: Shape {
    var width: Double
    var height: Double

    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }

    override func area() -> Double {
        return width * height
    }
}

class Circle: Shape {
    var radius: Double

    init(radius: Double) {
        self.radius = radius
    }

    override func area() -> Double {
        return Double.pi * radius * radius
    }
}
  • 在printarea()函数中,我们接受形状的实例作为参数。
  • 区域()方法将根据对象的实际类型动态调度,并将执行正确的实现。
  • 这个示例演示了Liskov替代原理如何使我们可以将不同子类的对象视为可互换的对象,只要它们符合共同的超级类界面。
func printArea(shape: Shape) {
    let area = shape.area()
    print("Area: \(area)")
}

let rectangle = Rectangle(width: 4, height: 5)
let circle = Circle(radius: 3)

printArea(shape: rectangle) // Output: Area: 20.0
printArea(shape: circle)    // Output: Area: 28.274333882308138