什么是 Liskov 替换原则以及如何在 C# 中实现该原则?
导出类型必须完全替换为其基类型。
定义
我们应该把子类当做父类来对待。本质上这意味着所有导出类应该保留其父类所有功能并且不能取代父类提供的任何功能。
Liskov 替换之前
public class Ellipse { public double MajorAxis { get; set; } public double MinorAxis { get; set; } public virtual void SetMajorAxis(double majorAxis){ this.MajorAxis = majorAxis; } public virtual void SetMinorAxis(double minorAxis){ this.MajorAxis = minorAxis; } public virtual double Area() { return MajorAxis * MinorAxis * Math.PI; } } public class Circle : Ellipse { public override void SetMajorAxis(double majorAxis) { base.SetMajorAxis(majorAxis); this.MinorAxis = majorAxis; //In a cirle, each axis is identical } } public class Result { public void Method1() { Circle circle = new Circle(); circle.SetMajorAxis(5); circle.SetMinorAxis(4); var area = circle.Area(); //5*4 = 20, but we expected 5*5 = 25 } }
Liskov 替换之后
internal class Program { private static void Main() { } } public class Ellipse { public double MajorAxis { get; set; } public double MinorAxis { get; set; } public virtual void SetMajorAxis(double majorAxis) { MajorAxis = majorAxis; } public virtual void SetMinorAxis(double minorAxis) { MajorAxis = minorAxis; } public virtual double Area() { return MajorAxis * MinorAxis * Math.PI; } } public class Circle : Ellipse { public override void SetMajorAxis(double majorAxis) { base.SetMajorAxis(majorAxis); this.MinorAxis = majorAxis; //In a cirle, each axis is identical } public override void SetMinorAxis(double minorAxis) { base.SetMinorAxis(minorAxis); this.MajorAxis = minorAxis; } public override double Area() { return base.Area(); } } public class Circle1 { public double Radius { get; set; } public void SetRadius(double radius) { this.Radius = radius; } public double Area() { return this.Radius * this.Radius * Math.PI; } }
广告