什麼是 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;
}
}
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP