多態是面向對象三大支柱之一 (封裝、繼承、多態)。核心規則:子類對象可作為父類對象使用。當父類引用指向子類對象並調用虛方法時,執行的是子類的重寫實現。
virtual 虛方法override 重寫虛方法public class DrawingObject {
public virtual void Draw() {
Console.WriteLine("I'm just a generic drawing object.");
}
}
virtual 允許派生類重寫。基類提供預設實現。
public class Line : DrawingObject {
public override void Draw() { Console.WriteLine("I'm a Line."); }
}
public class Circle : DrawingObject {
public override void Draw() { Console.WriteLine("I'm a Circle."); }
}
public class Square : DrawingObject {
public override void Draw() { Console.WriteLine("I'm a Square."); }
}
override 確保運行時替換基類實現。若無 virtual 則為隱藏 (new),不構成多態。
public class DrawDemo {
public static int Main() {
DrawingObject[] dObj = new DrawingObject[4];
dObj[0] = new Line();
dObj[1] = new Circle();
dObj[2] = new Square();
dObj[3] = new DrawingObject(); // 基類實例
foreach (DrawingObject obj in dObj) {
obj.Draw(); // 運行時動態綁定
}
return 0;
}
}
I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.
DrawingObject[],但元素實際類型各異。foreach 遍歷時,編譯時綁定的是 DrawingObject.Draw,但運行時根據對象實際類型分發到 Line.Draw、Circle.Draw 等。多態讓代碼對擴展開放 (新增形狀類無需修改 DrawDemo),對修改關閉。虛方法與重寫是實現多態的語法基石。設計模式中 策略模式、模板方法模式 等均建立在此機制之上。