virtual(C# 參考)
virtual 關鍵字用於修飾方法、屬性、索引器或事件聲明,並且允許在衍生類別中重寫這些對象。例如,此方法可被任何繼承它的類重寫。
複製代碼
public virtual double Area() { return x * y;}
虛擬成員的實現可由衍生類別中的重寫成員更改。有關使用 virtual 關鍵字的更多資訊,請參見使用 Override 和 New 關鍵字進資料列版本設定(C# 編程指南) 和瞭解何時使用 Override 和 New 關鍵字(C# 編程指南)。
備忘
調用虛方法時,將為重寫成員檢查該對象的運行時類型。將調用大部指派生類中的該重寫成員,如果沒有衍生類別重寫該成員,則它可能是原始成員。
預設情況下,方法是非虛擬。不能重寫非虛方法。
virtual 修飾符不能與 static、abstract, private 或 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 方法具有相同的簽名。有關繼承的資訊,請參見繼承。
不能重寫非虛方法或靜態方法。重寫的基方法必須是 virtual、abstract 或 override 的。
override 聲明不能更改 virtual 方法的可訪問性。override 方法和 virtual 方法必須具有相同的存取層級修飾符。
不能使用修飾符 new、static、virtual 或 abstract 來修改 override 方法。
重寫屬性聲明必須指定與繼承屬性完全相同的存取修飾詞、類型和名稱,並且被重寫的屬性必須是 virtual、abstract 或 override 的。