在C#中多態性的定義是:同一操作作用於不同類的執行個體,不同的類進行不同的解釋,最後產生不同的執行結果。換句話說也就是 一個介面,多個功能。
C# 支援2種形式的多態性: 編譯時間的多態性、運行時的多態性
編譯時間的多態性:
編譯時間的多態性是通過重載來實現的
方法重載
您可以在同一個範圍內對相同的函數名有多個定義。函數的定義必須彼此不同,可以是參數列表中的參數類型不同,也可以是參數個數不同。不能重載只有傳回型別不同的函式宣告。寫個例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class exchange //定義一個exchange類 {//方法實現交換兩參數資料 public void swap(int a, int b) { int temp; temp = a; a = b; b = temp; Console.WriteLine("{0},{1}",a,b); } public void swap(string a, string b) { string temp; temp = a; a = b; b = temp; Console.WriteLine("{0},{1}", a, b); } } class program { static void Main(string[] args) { exchange exch = new exchange(); exch.swap(10, 20); //調用 swap(int a,int b)方法 exch.swap("大", "小"); //調用 swap(string a,string b)方法 } } }
結果:
操作符重載
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class student //定義student類 { private int Chinese; private int Math; public void value(int a, int b) //定義一個賦值的方法,以後學了構造方法就不這麼麻煩了 { Chinese = a; Math = b; } public static student operator + (student a, student b) //運算子多載,實現相加功能 { student stu = new student(); stu.Chinese = a.Chinese + b.Chinese; stu.Math = a.Math + b.Math; return stu; } public int getChinese() //擷取Chinese 的方法 { return Chinese; } public int getMath() //擷取Math 的方法 { return Math; } } class program { static void Main(string[] args) { student a = new student(); student b = new student(); a.value(70,80); b.value(40, 50); student stu = a + b; //70+40, 80+50 Console.WriteLine("a+b Chinese = {0}\na+b Math = {1}", stu.getChinese(), stu.getMath()); } } }
結果:
運行時的多態性:
運行時的多態是指直到系統運行時,才根據實際情況決定實現何種操作,C#中運行時的多態通過抽象類別或虛方法來實現的。
抽象類別和抽象方法
C# 允許您使用關鍵字 abstract 建立抽象類別或抽象方法,當一個衍生類別繼承自該抽象類別時,實現即完成。抽象類別包含抽象方法,抽象方法可被衍生類別實現。衍生類別具有更專業的功能。抽象類別不能夠被執行個體化,
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test {//建立抽象類別和抽象方法 abstract class score { public abstract int Add(); } //建立子類 class student : score { private int Chinese = 80; private int Math = 90; public override int Add() //關鍵字 override 執行個體方法 { int sum=Chinese+Math; return sum; } } class program { static void Main(string[] args) { student stu = new student(); Console.WriteLine(stu.Add() ); //結果 170 } } }
虛方法
虛方法是使用關鍵字 virtual 聲明的。虛方法可以在不同的繼承類中有不同的實現。對虛方法的調用是在運行時發生的。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class score { protected int Chinese = 80; protected int Math = 90; public virtual int Add() //定義一個虛方法 { int sum = Chinese + Math; return sum; } } //定義子類,實現方法 class student : score { public override int Add() //關鍵字 override 執行個體方法,實現相減操作 { int sub = Math - Chinese ; return sub; } } class program { static void Main(string[] args) { student stu = new student(); Console.WriteLine(stu.Add() ); //結果 10 } } }
我們可以看出運行時真正調用的方法並不是虛方法,而是override 執行個體後的方法
以上就是 C#學習日記23---多態性 之 運算子多載、方法重載、抽象類別、虛方法的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!