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;

   }

}

以上是 Liskov替代原理是什么?如何在C#中实现? 的全部内容, 来源链接: utcz.com/z/343254.html

回到顶部