virtual (c#參考) .

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

發佈了45 篇原創文章 · 獲贊 4 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章