国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#類的多態(tài)性詳解

2019-10-29 21:37:42
字體:
來源:轉載
供稿:網(wǎng)友

這篇文章主要介紹了C#類的多態(tài)性,主要有兩種:一是編譯時的多態(tài)性,二是運行時的多態(tài)性,需要的朋友可以參考下

第一種:編譯時的多態(tài)性,

直接這樣說不知道說啥?程序執(zhí)行過程主要分為三步:編譯,鏈接,運行。在編譯時體現(xiàn)的多態(tài)性是通過方法的重載來實現(xiàn)的。方法的重載我們聽過,就是一個類對象調(diào)用若干同名,但參數(shù)類型、個數(shù)不同。類對象是根據(jù)參數(shù)類型,個數(shù)來決定調(diào)用哪個同名方法,實現(xiàn)何種操作。C#語言的方法重載與C++、java基本是一樣的,但是C#還包含C++的運算符重載,java里面沒有這個概念。

第二種:運行時的多態(tài)性,

是在系統(tǒng)運行時,調(diào)用一個名字相同,參數(shù)類型也相同以及個數(shù)也完全一樣的方法,但會完成不同的操作。C#運行時的多態(tài)性通過虛方法實現(xiàn)。在類方法聲明加上了virtual修飾符,稱為虛方法,反之為非虛方法。就這一點C#跟C++有很多相似之處。

代碼清單:虛方法與非虛方法的區(qū)別

 

 
  1. namespace e_11  
  2. {  
  3. class A  
  4. {  
  5. public void F() //非虛方法  
  6. { Console.WriteLine("A.F"); }  
  7. public virtual void G() //虛方法  
  8. { Console.WriteLine("A.G"); }  
  9.  
  10. }  
  11. class B : A //A類為B類的基類  
  12. {  
  13. new public void F() //隱藏基類的同名非虛方法F(),注意使用new  
  14. { Console.WriteLine("B.F"); }  
  15. public override void G() //隱藏基類的同名虛方法G(),注意使用override  
  16. { Console.WriteLine("B.G"); }  
  17. }  
  18. class Test  
  19. {  
  20. static void F2(A aA) //注意,參數(shù)為A類引用變量  
  21. { aA.G(); }  
  22. static void Main(string[] args)  
  23. {  
  24. B b = new B();  
  25. A a1 = new A();  
  26. A a2 = b; //允許基類引用變量引用派生類對象,a2引用A類的派生類B的對象b  
  27. a1.F(); //調(diào)用基類A的非虛方法F(),顯示A.F  
  28. a2.F(); //F()為非虛方法,調(diào)用基類A的F(),顯示A.F  
  29. b.F(); //F()為非虛方法,調(diào)用派生類的F(),顯示B.F  
  30. a1.G(); //G()為虛方法,因a1引用基類A對象,調(diào)用基類A的G(),顯示A.G  
  31. a2.G(); //G()為虛方法,因a2引用派生類B對象,調(diào)用派生類B的G(),顯示B.G  
  32. F2(a2); //由于a2引用A類派生類B的對象b,調(diào)用派生類B的的G(),顯示B.G  
  33. F2(a1); //實參為基類A對象,調(diào)用A類的函數(shù)G(),顯示A.G  
  34. }  
  35. }  
  36. }  

輸出結果:

C#類的多態(tài)性詳解

看上面的代碼,我產(chǎn)生了一個疑問?為什么因為G()為虛方法,a2引用派生類B對象,調(diào)用的是B類的G()?

這里有一個解釋:如果將基類引用變量引用不同對象,或者是基類對象,或者是派生類對象,用這個基類引用變量分別調(diào)用同名虛方法,根據(jù)對象的不同,會完成不同的操作。而非虛方法不具備次此功能。

關于類的多態(tài)性典型的例子:

 

 
  1. //類的多態(tài)性  
  2. namespace e_11  
  3. {  
  4. public class Person  
  5. {  
  6. private String name = "張三"//類的成員說明  
  7. private int age = 12;  
  8. protected virtual void Display() //類的虛方法  
  9. { Console.WriteLine("姓名:{0},年齡:{1}", name, age); }  
  10. public Person(string Name, int Age) //構造函數(shù),函數(shù)名和類名同名,無返回值  
  11. { name = Name; age = Age; }  
  12. static public void DisplayData(Person aPerson) //靜態(tài)方法  
  13. { aPerson.Display(); } //不是靜態(tài)方法調(diào)用實例方法,如寫為Display()錯誤  
  14. }  
  15.  
  16. public class Employe : Person //基類是Person  
  17. {  
  18. private string department;  
  19. private decimal salary;  
  20. public Employe(string Name, int Age, string D, decimal S)  
  21. : base(Name, Age)  
  22. { department = D; salary = S; }  
  23. protected override void Display() //重載虛方法,注意用Override  
  24. {  
  25. base.Display();  
  26. Console.WriteLine("部門:{0}, 薪金:{1}", department, salary);  
  27. }  
  28. }  
  29.  
  30. class Class1  
  31. {  
  32. static void Main(string[] args)  
  33. {  
  34. Person OnePerson = new Person("李四", 30);  
  35. Person.DisplayData(OnePerson); //顯示基類的數(shù)據(jù)  
  36. Employe OneEmployee = new Employe("王五", 40, "財務", 2000);  
  37. Person.DisplayData(OneEmployee); //顯示派生類數(shù)據(jù)  
  38. }//兩次調(diào)用完全相同的方法,實參不同,實現(xiàn)的功能不同  
  39. }  
  40.  
  41. }  

運行效果:

C#類的多態(tài)性詳解

以上就是本文的全部內(nèi)容,希望能夠幫到大家。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 精河县| 加查县| 齐齐哈尔市| 宿松县| 鄂尔多斯市| 普宁市| 涞源县| 曲阜市| 运城市| 溧阳市| 洛扎县| 辽源市| 云安县| 松桃| 达州市| 光山县| 塔城市| 甘泉县| 通城县| 山阴县| 纳雍县| 黑龙江省| 饶平县| 宾川县| 当阳市| 泾川县| 宿松县| 信丰县| 韶关市| 巨野县| 桦川县| 中西区| 修武县| 香格里拉县| 清河县| 成安县| 祁东县| 密山市| 原平市| 延津县| 开鲁县|