多態性是在 C# 等物件導向程式語言中實現的概念,其中運算子或函數方法在整個執行過程中可以採用多種形式。它廣泛用於程式中繼承的實現,分為兩種方法,即運算子重載和函數重載。簡而言之,多態性可以解釋為一種使用衍生類別更改基底類別的技術,其中兩個類別都擁有不同的屬性。
下圖說明了多態性的工作原理:
此圖說明黏土是製作鍋子、碗和玩具的母體。所有這些物體都彼此不同,但它們都具有黏土的特性。這三個物體即使是由相同的材料黏土製成,也具有不同的形狀和不同的用途。
以下是多態性的兩種形式:
運算子可以根據其操作的操作數類型給出不同的輸出。這稱為運算子重載。例如,運算子「+」可以對兩個整數執行加法,同時它可以連接兩個字串。因此,同一個運算子可以以兩種不同的方式使用。加法運算子通常將兩個數字相加。然而,在複數的情況下,加法有點不同,其中相應的實部和虛部是分開相加的。下面是一個範例程式碼,展示如何重載‘+’運算子來新增複數。
代碼:
using System; namespace Overload { class Complex { public double x; public double y; // no-argument constructor public Complex() {} // parameterized constructor public Complex(double real, double img) { x = real; y = img; } // Overloading of Binary "+" operator public static Complex operator + (Complex c1, Complex c2) { Complex c3 = new Complex(); c3.x = c1.x + c2.x; c3.y = c1.y + c2.y; return c3; } // function to display result public void display() { Console.WriteLine("{0} + {1}i", x,y); } } class CalNum { // Driver Code static void Main(string[] args) { Complex num1 = new Complex(2.5,3.5); Complex num2 = new Complex(1.2,6.5); Complex num3 = num1 + num2; Console.Write("c1 = "); num1.display(); Console.Write("c2 = "); num2.display(); Console.Write("c3 = "); num3.display(); } } }
輸出:
此輸出說明了運算子重載以新增兩個複數。程式碼顯示了運算子重載以及函數重載。
函數可以根據參數數量及其返回類型和函數返回類型給出不同的輸出。上述程式碼也涵蓋了使用建構函數的函數重載。程式碼中有2個建構函數;一個是預設建構函數,保留為空,而另一個是參數化建構函數,用來使用作為參數提到的值來初始化複數。
以圖中所示為例,功能是塑造黏土,筆畫方向是提供用來塑造黏土的構件。根據不同的筆劃方向,黏土分別變成了鍋子、碗和玩具。
代碼:
using System; using System.Collections.Generic; public class Clay { // A few example members public int Height { get; set; } public int strokeDirection { get; set; } // Virtual method public virtual void Mould() { Console.WriteLine("Beginning to mould the clay"); } } class Pot : Clay { public override void Mould() { // Code to make a pot Console.WriteLine("Making a pot"); base.Mould(); } } class Bowl : Clay { public override void Mould() { // Code to make a bowl Console.WriteLine("Making a bowl"); base.Mould(); } } class Toy : Clay { public override void Mould() { // Code to make a toy Console.WriteLine("Making a toy"); base.Mould(); } } class Program { static void Main(string[] args) { // Illustrating Polymorphism #1: a Pot, Bowl and Toy // can all be used wherever Clay is expected. No cast is // needed because an implicit conversion exists from a derived // class to its base class. var items = new List<Clay> { new Pot(), new Bowl(), new Toy() }; // Polymorphism at work #2: the virtual method Mould is // invoked on each of the derived classes, not the base class. foreach (var item in items) { item.Mould(); } } }
輸出:
如您在程式碼中可能已經注意到的,clay 類別是父類,其子類別是pot、toy 和bowl 類別。方法“Mould”在父類別和子類別中定義,具有相同的函數簽名。因此,當建立子類別的物件並呼叫方法 Mould 時,基底類別方法會將被子類別方法覆寫。因此,我們看到了子類別方法的輸出。上面的程式碼顯示了方法重寫而不是重載以說明多態性。
C#中多態性需要牢記的要點:
以下是一些關鍵要點:
以上是C# 中的多態性的詳細內容。更多資訊請關注PHP中文網其他相關文章!