virtual關鍵字用於修飾方法、屬性、索引器或事件聲明,並使它們可以在派生類中被重寫。這提供了一種使派生類可以包含與基類方法同名的方法的機制。
- 使用virtual有以下幾個要點:
- 1、基類方法必須定義爲virtual。
- 2、如果派生類中的方法前面帶有new關鍵字,則該方法被定義爲獨立於基類中的方法(也就是說與基類中的同名方法共存,但是基類的方法被隱藏了)。
- 3、如果派生類中的方法前面帶有override關鍵字,則派生類中的方法是對基類中的方法進行覆蓋。
- 4、如果派生類中的方法前面沒有new或override,則默認是new,編譯器會發出警告。
5、可以在派生類中使用base關鍵字來訪問基類中的方法。 - 6、以上幾條對屬性、索引器和事件也適用。
當在類中指定方法時,如果有多個方法與調用兼容(例如,存在兩種同名的方法,並且其參數與傳遞的參數兼容),則 C# 編譯器將選擇最佳方法進行調用。
示例:
class Sharp
{
public virtual void area(int x, int y)
{
System.Console.WriteLine("Sharp.area():{0:F2}", x * y);
}
}
class Rect : Sharp { public new void area(int x, int y) { System.Console.WriteLine("Rect.area():int:{0:F2}", x * y); } public void area(double x, double y) { System.Console.WriteLine("Rect.area():double:{0:F2}", x * y); } }
class Circle : Sharp { private static double PI = Math.PI; public override void area(int x, int y) { System.Console.WriteLine("Circle.area():overide{0:F2}", PI * x * x); } public void area(double x, double y) { System.Console.WriteLine("Circle.area():double:{0}", PI * x * x); } }
class TestSuite { public static void Test() { Rect c1 = new Rect(); c1.area(1, 2); c1.area(1.1, 2.2); ((Sharp)c1).area(1, 2); Circle c2 = new Circle(); c2.area(1, 2); ((Sharp)c2).area(2, 2); System.Console.ReadLine(); } }
執行結果:
Rect.area():int:2.00
Rect.area():double:2.42
Sharp.area():2.00
Circle.area():double:3.14159265358979
Circle.area():overide12.57