virtual 虛擬方法override 覆寫using System;
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 提供專屬實作。
public class DrawDemo
{
public static int Main()
{
DrawingObject[] objs = new DrawingObject[4];
objs[0] = new Line();
objs[1] = new Circle();
objs[2] = new Square();
objs[3] = new DrawingObject();
foreach (DrawingObject obj in objs)
obj.Draw(); // 執行期依實際型別派發
return 0;
}
}
I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.
DrawingObject[] 可容納所有衍生類實例(Liskov 替換原則)。virtual,衍生類用 new 隱藏,則透過基類參考呼叫仍執行基類版本(靜態繫結)。sealed override:防止進一步覆寫。base.Draw():在覆寫方法中呼叫基類實作。override。obj switch { Line l => ..., Circle c => ... } 也是多型的一種表達。