多態是C#中的重要概念之一。多態性有兩種類型,編譯時和執行時。重載和覆蓋概念分別用於實現此目的。在重寫中,子類別可以以不同的方式實作父類別方法,但子類別方法與父類別具有相同的名稱和相同的方法簽名,而在重載中,一個類別中有多個具有相同名稱和不同參數的方法。
C# 中覆蓋和重載的工作原理透過範例進行解釋:
我們在重寫時會使用一些關鍵字,例如 virtual、override 和 base。
文法:
class Parent { public virtual void Example() // base class { Console.WriteLine("parent class"); } } class Child: Parent { public override void Example() // derived class { base.Example(); Console.WriteLine("Child class"); } }
這裡使用了virtual和override關鍵字,這意味著基類是virtual的,子類可以實現這個類,override意味著這個子類與父類具有相同的名稱和相同的方法簽名。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverridingExample { class Subject // base class { public virtual void study() // base class method { Console.WriteLine("Study all the subjects"); } } class Mathematics: Subject // derived class { public override void study() // derived class method { Console.WriteLine("Study Mathematics"); } } class Program { // main method static void Main(string[] args) { Subject s = new Mathematics(); s.study(); Console.ReadLine(); } } }
在上面的範例中,方法名稱相同,但實作不同。基底類別具有虛擬函數,因此子類別可以以自己的方式實作父類別方法。子類別方法有關鍵字 override ,表示該方法是重寫方法。
輸出:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverridingExample { class Subject // base class { public virtual void study() // base class method { Console.WriteLine("Study all the subjects"); } } class Mathematics: Subject // derived class { public override void study() // derived class method { base.study(); Console.WriteLine("Study Mathematics"); } } class Program { // main method static void Main(string[] args) { Mathematics m = new Mathematics(); m.study(); Console.ReadLine(); } } }
輸出:
在此範例中,衍生類別有一個基底關鍵字,用於呼叫基底類別方法。因此,在這種情況下,派生方法會在基底類別方法之後被呼叫。
要記住的重點:
在重載中,存在多個具有不同方法簽名的方法。以下是一些範例,展示如何透過改變參數數量、參數順序和參數資料類型來實現重載。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverloadingExample { class Demo { public int Sum(int x, int y) { int value = x + y; return value; } public int Sum(int x, int y, int z) { int value = x + y + z; return value; } public static void Main(string[] args) // main method { Demo d = new Demo(); int sum1 = d.Sum(24, 28); Console.WriteLine("sum of the two " + "integer value : " + sum1); int sum2 = d.Sum(10, 20, 30); Console.WriteLine("sum of the three " + "integer value : " + sum2); Console.ReadLine(); } } }
在上面的範例中,有兩個名稱相同但參數數量不同的方法。 第一個方法包含兩個參數,而第二個方法包含三個參數。這稱為方法重載。
輸出:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverloadingExample { class Demo { public int Sum(int x, int y, int z) { int value = x + y + z; return value; } public double Sum(double x, double y, double z) { double value = x + y + z; return value; } public static void Main(string[] args) // main method { Demo d = new Demo(); int sum1 = d.Sum(24, 28,7); Console.WriteLine("sum of the two " + "integer value : " + sum1); double sum2 = d.Sum(10.0, 20.0, 30.0); Console.WriteLine("sum of the three " + "integer value : " + sum2); Console.ReadLine(); } } }
在上面的範例中,有兩個方法名稱相同,但資料型別不同。第一個方法具有整數資料類型,而第二個方法具有雙精確度資料類型。因此,在這種情況下,參數會因資料類型的不同而變化。
輸出:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverloadingExample { class Demo { public void Details(String name,int id) { Console.WriteLine("Name " + name + ", " + "Id " + id); ; } public void Details(int id,string name) { Console.WriteLine("Name " + name + ", " + "Id " + id); } public static void Main(string[] args) // main method { Demo d = new Demo(); d.Details("John", 10); d.Details("Joe", 20); Console.ReadLine(); } } }
在上面的範例中,方法名稱相同,但參數順序不同。第一個方法有名稱和 ID。而第二個分別有 id 和 name。
輸出:
要記住的重點:
以下是優點說明。
重載和重寫在實現多態性方面發揮著重要作用。重寫允許派生類別以自己的方式實現,另一方面重載是關於具有相同名稱的方法和各種類型的參數實現。
以上是C# 中的重載與重寫的詳細內容。更多資訊請關注PHP中文網其他相關文章!