lsp指出,超级类的对象应被其子类的对象替换而不影响程序的正确性-Barbara Liskov(1987)
在下面的示例中,
- 我们有一个代表不同形状的类层次结构:超级类
Shape
和两个子类,Rectangle
和Circle
。 -
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