首頁 >後端開發 >C#.Net教程 >C# 中的虛擬關鍵字 

C# 中的虛擬關鍵字 

WBOY
WBOY原創
2024-09-03 15:26:38934瀏覽

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
}

虛擬在 C# 中如何運作?

重載和重寫之間最基本的區別在於,前者是編譯時機制,而後者在運行時發揮作用。 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());
}
}

輸出:

C# 中的虛擬關鍵字 

上面的程式碼是如何運作的?

在基底類別 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# 中虛擬的概念。我們了解了 C# 如何在運行時實現 virtual 關鍵字並查看了範例。

虛擬成員是物件導向程式設計的一個偉大概念。然而,為了獲得深入的知識,強烈建議學習abstract關鍵字、interfaces和new關鍵字。這將極大地有助於理解它們之間的差異。這有助於了解何時使用和何時不使用虛擬。

以上是C# 中的虛擬關鍵字 的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn