파생 유형은 기본 유형을 완전히 대체할 수 있어야 합니다.
정의:
자식 클래스를 부모 클래스처럼 취급할 수 있어야 합니다. 본질적으로 이것은 모든 파생 클래스가 부모 클래스의 기능을 유지해야 하며 부모가 제공하는 기능을 대체할 수 없음을 의미합니다.
리스코프 교체 전
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 } }
리스코프 교체 후
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; } }