C#類的多態(tài)性詳解
第一種:編譯時(shí)的多態(tài)性,直接這樣說不知道說啥?程序執(zhí)行過程主要分為三步:編譯,鏈接,運(yùn)行。在編譯時(shí)體現(xiàn)的多態(tài)性是通過方法的重載來實(shí)現(xiàn)的。方法的重載我們聽過,就是一個(gè)類對(duì)象調(diào)用若干同名,但參數(shù)類型、個(gè)數(shù)不同。類對(duì)象是根據(jù)參數(shù)類型,個(gè)數(shù)來決定調(diào)用哪個(gè)同名方法,實(shí)現(xiàn)何種操作。C#語言的方法重載與C++、java基本是一樣的,但是C#還包含C++的運(yùn)算符重載,java里面沒有這個(gè)概念。
第二種:運(yùn)行時(shí)的多態(tài)性,是在系統(tǒng)運(yùn)行時(shí),調(diào)用一個(gè)名字相同,參數(shù)類型也相同以及個(gè)數(shù)也完全一樣的方法,但會(huì)完成不同的操作。C#運(yùn)行時(shí)的多態(tài)性通過虛方法實(shí)現(xiàn)。在類方法聲明加上了virtual修飾符,稱為虛方法,反之為非虛方法。就這一點(diǎn)C#跟C++有很多相似之處。
代碼清單:虛方法與非虛方法的區(qū)別
namespace e_11 { class A { public void F() //非虛方法 { Console.WriteLine("A.F"); } public virtual void G() //虛方法 { Console.WriteLine("A.G"); } } class B : A //A類為B類的基類 { new public void F() //隱藏基類的同名非虛方法F(),注意使用new { Console.WriteLine("B.F"); } public override void G() //隱藏基類的同名虛方法G(),注意使用override { Console.WriteLine("B.G"); } } class Test { static void F2(A aA) //注意,參數(shù)為A類引用變量 { aA.G(); } static void Main(string[] args) { B b = new B(); A a1 = new A(); A a2 = b; //允許基類引用變量引用派生類對(duì)象,a2引用A類的派生類B的對(duì)象b a1.F(); //調(diào)用基類A的非虛方法F(),顯示A.F a2.F(); //F()為非虛方法,調(diào)用基類A的F(),顯示A.F b.F(); //F()為非虛方法,調(diào)用派生類的F(),顯示B.F a1.G(); //G()為虛方法,因a1引用基類A對(duì)象,調(diào)用基類A的G(),顯示A.G a2.G(); //G()為虛方法,因a2引用派生類B對(duì)象,調(diào)用派生類B的G(),顯示B.G F2(a2); //由于a2引用A類派生類B的對(duì)象b,調(diào)用派生類B的的G(),顯示B.G F2(a1); //實(shí)參為基類A對(duì)象,調(diào)用A類的函數(shù)G(),顯示A.G } } }
輸出結(jié)果:
看上面的代碼,我產(chǎn)生了一個(gè)疑問?為什么因?yàn)镚()為虛方法,a2引用派生類B對(duì)象,調(diào)用的是B類的G()?
這里有一個(gè)解釋:如果將基類引用變量引用不同對(duì)象,或者是基類對(duì)象,或者是派生類對(duì)象,用這個(gè)基類引用變量分別調(diào)用同名虛方法,根據(jù)對(duì)象的不同,會(huì)完成不同的操作。而非虛方法不具備次此功能。
關(guān)于類的多態(tài)性典型的例子:
//類的多態(tài)性 namespace e_11 { public class Person { private String name = "張三"; //類的成員說明 private int age = 12; protected virtual void Display() //類的虛方法 { Console.WriteLine("姓名:{0},年齡:{1}", name, age); } public Person(string Name, int Age) //構(gòu)造函數(shù),函數(shù)名和類名同名,無返回值 { name = Name; age = Age; } static public void DisplayData(Person aPerson) //靜態(tài)方法 { aPerson.Display(); } //不是靜態(tài)方法調(diào)用實(shí)例方法,如寫為Display()錯(cuò)誤 } public class Employe : Person //基類是Person { private string department; private decimal salary; public Employe(string Name, int Age, string D, decimal S) : base(Name, Age) { department = D; salary = S; } protected override void Display() //重載虛方法,注意用Override { base.Display(); Console.WriteLine("部門:{0}, 薪金:{1}", department, salary); } } class Class1 { static void Main(string[] args) { Person OnePerson = new Person("李四", 30); Person.DisplayData(OnePerson); //顯示基類的數(shù)據(jù) Employe OneEmployee = new Employe("王五", 40, "財(cái)務(wù)", 2000); Person.DisplayData(OneEmployee); //顯示派生類數(shù)據(jù) }//兩次調(diào)用完全相同的方法,實(shí)參不同,實(shí)現(xiàn)的功能不同 } }
運(yùn)行效果:
以上就是本文的全部?jī)?nèi)容,希望能夠幫到大家。
上一篇:C#操作數(shù)據(jù)庫中存取圖片文件的方法
欄 目:C#教程
本文標(biāo)題:C#類的多態(tài)性詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6918.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#停止線程的方法
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新聞效果的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)多線程下載文件的方法


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載