Computer >> 컴퓨터 >  >> 프로그램 작성 >> C#

Liskov 대체 원칙은 무엇이며 C#에서 구현하는 방법은 무엇입니까?

<시간/>

파생 유형은 기본 유형을 완전히 대체할 수 있어야 합니다.

정의:

자식 클래스를 부모 클래스처럼 취급할 수 있어야 합니다. 본질적으로 이것은 모든 파생 클래스가 부모 클래스의 기능을 유지해야 하며 부모가 제공하는 기능을 대체할 수 없음을 의미합니다.

리스코프 교체 전

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;
   }
}