C# 中的重寫是在衍生類別中重新實作基底類別方法。在此,基類方法在子類中被重寫。衍生類別方法與基底類別方法具有相同的名稱和簽名。重寫對於實現運行時多態性很有用。
方法重寫中使用了一些關鍵字。
1。 Virtual – 此關鍵字與基底類別一起使用,表示基底類別的方法可以重寫。
public virtual void Method() { // implementation }
2。 Override – 此關鍵字與衍生類別一起使用,表示衍生類別重寫基底類別的方法。
public override void Method() { // implementation }
3。 Base – 此關鍵字在衍生類別中用於呼叫基底類別方法。
public override void Method() { base.Method(); // implementation }
以下是我們如何在 C# 中實作重寫的範例。
class Parent { public virtual void Demo() // base class { Console.WriteLine(“This is parent”); } } class Child: Parent { public override void Demo() // derived class { Console.WriteLine(“This is child”); } }
在上面的例子中有兩個類,一個是基類或父類,另一個是派生類,或者我們可以說,子類。子類別中衍生出基底類別方法。在這種情況下,父類別中的方法是虛擬的,這意味著它可以被子類別覆蓋。在子類別中重寫意味著該方法與具有相同方法簽名的父類別方法相同。
以下是顯示使用各種關鍵字覆蓋的範例。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Overriding { class Bird // base class { public void fly() // base class method { Console.WriteLine("Birds are flying"); } } class Peacock : Bird // derived class { public new void fly() // derived class method { Console.WriteLine("Peacock is flying"); } } class Program { // main method static void Main(string[] args) { Bird b = new Peacock(); b.fly(); Console.ReadLine(); } } }
在上面的範例中,基底類別方法和衍生方法均未使用關鍵字。
同樣在main方法中,父引用用於呼叫子方法。因此,在這種情況下,當不使用關鍵字時,將呼叫父方法而不是子方法。所以輸出會是
輸出:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Overriding { class Bird // base class { public virtual void fly() // base class method { Console.WriteLine("Birds are flying"); } } class Peacock : Bird // derived class { public override void fly() // derived class method { Console.WriteLine("Peacock is flying"); } } class Program { // main method static void Main(string[] args) { Bird b = new Peacock(); b.fly(); Console.ReadLine(); } } }
在這個例子中,基類中使用了virtual,這意味著它賦予子類別以自己的方式實現方法的權限。在衍生類別中,使用重寫,這意味著子方法是重寫方法。兩種方法具有相同的名稱和相同的方法簽名,但實作部分不同。在此範例中,父引用也用於呼叫子方法。但由於父方法是虛擬的,因此首先呼叫子方法而不是父方法。所以輸出會是
輸出:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Overriding { class Bird // base class { public virtual void fly() // base class method { Console.WriteLine("Birds are flying"); } } class Peacock : Bird // derived class { public override void fly() // derived class method { Console.WriteLine("Peacock is flying"); } } class Program { //main method static void Main(string[] args) { Peacock p = new Peacock(); p.fly(); Console.ReadLine(); } } }
此範例與上一個範例相同,但此子方法僅供參考。
輸出:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Overriding { class Bird // base class { public virtual void fly() // base class method { Console.WriteLine("Birds are flying"); } } class Peacock : Bird // derived class { public override void fly() // derived class method { base.fly(); // base is use to call parent method Console.WriteLine("Peacock is flying"); } } class Program { static void Main(string[] args) { Peacock p = new Peacock(); p.fly(); Console.ReadLine(); } } }
上面的範例中,在衍生類別中使用了基底類別來呼叫基底類別的方法。因此,在此基礎方法中首先調用,然後調用派生方法。
輸出:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Overriding { abstract class Calculate { public abstract int sum(); } class Values : Calculate // derived class { int val1; int val2; public Values(int a = 0, int b = 0) { val1 = a; val2 = b; } public override int sum() { Console.WriteLine("sum of two values"); return (val1 + val2); } } class Program { static void Main(string[] args) { Values v = new Values(10, 20); int a = v.sum(); Console.WriteLine(a); Console.ReadLine(); } } }
在上面的例子中,使用了抽象方法。抽象類別由包含抽象方法的衍生類別實作。
輸出:
重寫在運行時多態性中很有用。它允許衍生類別以自己的方式實作基底類別方法。因此派生類別與其基底類別的方法實作是不同的。重寫的方法可以是虛擬的、重寫的或抽象的。
以上是在 C# 中重寫的詳細內容。更多資訊請關注PHP中文網其他相關文章!