virtual 關鍵字是什麼?在直接進入 C# 視角之前,了解或修改物件導向程式設計世界中的繼承、重寫和虛擬關鍵字的概念非常重要。
方法重寫是一個與繼承緊密結合的 OOP 概念。當子類別方法重寫了具有相同名稱、參數和傳回類型的父類別方法時,稱為方法重寫。 virtual 關鍵字向編譯器表示某個方法可以在衍生類別中被重寫。
從 C# 的角度來看,virtual 關鍵字用於修改任何屬性、方法或事件的聲明,以允許在衍生類別中重寫。簡單來說,virtual 關鍵字實作了 C# 中方法重寫的概念。
文法
透過在基底類別中新增 virtual 關鍵字並在衍生類別中新增 override 關鍵字,可以覆寫任何屬性、方法或事件。
在基底類別聲明中加入virtual關鍵字:
public class Base { public virtual int abc { get; set; } // this property can be overridden public virtual void Xyz() { } // this method can be overridden }
在基底類別聲明中加入 override 關鍵字:
public class Derived : Base { public override int abc { get; set; } // this overrides the base class property public override void Xyz() { } // this overrides the base class method }
重載和重寫之間最基本的區別在於,前者是編譯時機制,而後者在運行時發揮作用。 virtual 關鍵字在運行時起作用,從而實現了方法重寫的概念。
當呼叫或存取任何虛擬方法或屬性時,編譯器會檢查該方法或屬性的重寫成員。如果找到,就會呼叫它。如果沒有找到,則呼叫原始方法或屬性。
這裡出現了一個很好的問題-在多層繼承的情況下會發生什麼事?好吧,如果任何類別成員在多個層級上被重寫,則會呼叫最深的重寫成員(最深的衍生類別中的成員)。
下面提到了 C# 中的虛擬關鍵字範例
讓我們舉個例子來了解當單一子類別繼承父類別時,即沒有多層繼承時,virtual 關鍵字的工作原理。
代碼:
using System; public class Polynomial { public virtual double len { get; set; } public virtual double wid { get; set; } public virtual double Area() { return len * wid; } } public class Rectangle: Polynomial { } public class Square : Polynomial { public override double len { get; set; } public override double Area() { return len * len; } } public class Circle : Polynomial { public double radius { get; set; } public override double Area() { return Math.PI * radius * radius; } } public class Triangle : Polynomial { public override double Area() { return 0.5 * len * wid; } } public class Program { public static void Main() { var rect = new Rectangle(); rect.len = 5; rect.wid = 10; Console.WriteLine("Area of Rectangle = " + rect.Area()); var sq = new Square(); sq.len = 15; Console.WriteLine("Area of Square = " + sq.Area()); var cir = new Circle(); cir.radius = 10; Console.WriteLine("Area of Circle = " + cir.Area()); var tri = new Triangle(); tri.len = 5; tri.wid = 10; Console.WriteLine("Area of Triangle = " + tri.Area()); } }
輸出:
在基底類別 Polynomial 中,我們將兩個屬性和一個方法宣告為 virtual。現在可以在子類別中覆寫這些。現在我們建立繼承 Polynomial 類別的各種不同形狀的子類別。
在 Rectangle 類別中,我們不需要重寫任何屬性或方法。基類實作將會原樣用於 Rectangle 類別。
在 Square 類別中,我們沒有 width 屬性。因此,我們重寫 length 屬性和 Area 方法以傳回長度的平方。
在 Circle 類別中,我們既沒有長度也沒有寬度。因此,我們宣告一個新的類別特定屬性 radius 並相應地重寫 Area 方法。
在 Triangle 類別中,我們只需重寫 Area 方法,屬性繼承自基底類別 Polynomial。
當我們建立衍生類別的物件時,編譯器在基底類別建構過程中遇到 virtual 關鍵字,從而尋找重寫的成員。然後相應地調用被覆蓋的成員。
讓我們修改上面的範例以包含多層繼承。
代碼:
using System; public class Polynomial { public virtual double len { get; set; } public virtual double wid { get; set; } public virtual double Area() { return 0; } } public class Rectangle : Polynomial { public override double Area() { return len * wid; } } public class Square : Rectangle { public override double len { get; set; } public override double Area() { return len * len; } } public class Program { public static void Main() { var rect = new Rectangle(); rect.len = 5; rect.wid = 10; Console.WriteLine("Area of Rectangle = " + rect.Area()); var sq = new Square(); sq.len = 15; Console.WriteLine("Area of Square = " + sq.Area()); } }
輸出:
虛擬成員在基底類別和衍生類別中都有聲明和定義。當派生類別中需要一些額外的功能時,虛擬成員是有利的。它們作為附加組件。
在這篇文章中,我們了解了 C# 中虛擬的概念。我們了解了 C# 如何在運行時實現 virtual 關鍵字並查看了範例。
虛擬成員是物件導向程式設計的一個偉大概念。然而,為了獲得深入的知識,強烈建議學習abstract關鍵字、interfaces和new關鍵字。這將極大地有助於理解它們之間的差異。這有助於了解何時使用和何時不使用虛擬。
以上是C# 中的虛擬關鍵字 的詳細內容。更多資訊請關注PHP中文網其他相關文章!