C#中的virtual與override學習筆記(摘自MSDN)

來源:互聯網
上載者:User
virtual(C# 參考)

virtual 關鍵字用於修飾方法、屬性、索引器或事件聲明,並且允許在衍生類別中重寫這些對象。例如,此方法可被任何繼承它的類重寫。

複製代碼

public virtual double Area() {    return x * y;}

虛擬成員的實現可由衍生類別中的重寫成員更改。有關使用 virtual 關鍵字的更多資訊,請參見使用 Override 和 New 關鍵字進資料列版本設定(C# 編程指南) 和瞭解何時使用 Override 和 New 關鍵字(C# 編程指南)。

 備忘

調用虛方法時,將為重寫成員檢查該對象的運行時類型。將調用大部指派生類中的該重寫成員,如果沒有衍生類別重寫該成員,則它可能是原始成員。

預設情況下,方法是非虛擬。不能重寫非虛方法。

virtual 修飾符不能與 staticabstract, privateoverride 修飾符一起使用。

除了聲明和調用文法不同外,虛擬屬性的行為與抽象方法一樣。

  • 在靜態屬性上使用 virtual 修飾符是錯誤的。

  • 通過包括使用 override 修飾符的屬性聲明,可在衍生類別中重寫虛擬繼承屬性。

 樣本

在該樣本中,Dimensions 類包含 x 和 y 兩個座標和 Area() 虛方法。不同的形狀類,如 Circle、Cylinder 和 Sphere 繼承 Dimensions 類,並為每個圖形計算表面積。每個衍生類別都有各自的 Area() 重寫實現。根據與此方法關聯的對象,通過調用正確的 Area() 實現,該程式為每個圖形計算並顯示正確的面積。

在前面的樣本中,注意繼承的類 Circle、Sphere 和 Cylinder 都使用了初始化基類的建構函式,例如:

複製代碼

public Cylinder(double r, double h): base(r, h) {}

這類似於 C++ 的初始化列表。

複製代碼

// cs_virtual_keyword.csusing System;class TestClass{    public class Dimensions    {        public const double PI = Math.PI;        protected double x, y;        public Dimensions()        {        }        public Dimensions(double x, double y)        {            this.x = x;            this.y = y;        }        public virtual double Area()        {            return x * y;        }    }    public class Circle : Dimensions    {        public Circle(double r) : base(r, 0)        {        }        public override double Area()        {            return PI * x * x;        }    }    class Sphere : Dimensions    {        public Sphere(double r) : base(r, 0)        {        }        public override double Area()        {            return 4 * PI * x * x;        }    }    class Cylinder : Dimensions    {        public Cylinder(double r, double h) : base(r, h)        {        }        public override double Area()        {            return 2 * PI * x * x + 2 * PI * x * y;        }    }    static void Main()    {        double r = 3.0, h = 5.0;        Dimensions c = new Circle(r);        Dimensions s = new Sphere(r);        Dimensions l = new Cylinder(r, h);        // Display results:        Console.WriteLine("Area of Circle   = {0:F2}", c.Area());        Console.WriteLine("Area of Sphere   = {0:F2}", s.Area());        Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());    }}

 輸出
Area of Circle   = 28.27Area of Sphere   = 113.10Area of Cylinder = 150.80
 
override(C# 參考)

要擴充或修改繼承的方法、屬性、索引器或事件的抽象實現或虛實現,必須使用 override 修飾符。

在此例中,類 Square 必須提供 Area 的重寫實現,因為 Area 是從抽象的 ShapesClass 繼承而來的。

複製代碼
abstract class ShapesClass{    abstract public int Area();}class Square : ShapesClass{    int x, y;    // Because ShapesClass.Area is abstract, failing to override    // the Area method would result in a compilation error.    public override int Area()    {        return x * y;    }}

有關 override 關鍵字用法的更多資訊,請參見使用 Override 和 New 關鍵字進資料列版本設定以及瞭解何時使用 Override 和 New 關鍵字。

 備忘

override 方法提供從基類繼承的成員的新實現。通過 override 聲明重寫的方法稱為重寫基方法。重寫的基方法必須與 override 方法具有相同的簽名。有關繼承的資訊,請參見繼承。

不能重寫非虛方法或靜態方法。重寫的基方法必須是 virtualabstractoverride 的。

override 聲明不能更改 virtual 方法的可訪問性。override 方法和 virtual 方法必須具有相同的存取層級修飾符。

不能使用修飾符 newstaticvirtualabstract 來修改 override 方法。

重寫屬性聲明必須指定與繼承屬性完全相同的存取修飾詞、類型和名稱,並且被重寫的屬性必須是 virtualabstractoverride 的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.