C#中虛方法virtual示例詳解
前言;在前面的博客重寫中提到了虛方法和抽象類,本博文詳細介紹下虛方法:
一.虛方法的定義:
當(dāng)有一個定義在類中的函數(shù)需要在繼承類中實現(xiàn)時,可以使用虛方法,虛方法是使用關(guān)鍵字virtual
聲明的,虛方法可以在不同的繼承類中有不同的實現(xiàn),即為基類中定義的允許在派生類中重寫的方法;
二.虛方法的聲明:
一般的聲明形式如下:
訪問修飾符 virtual 函數(shù)返回類型 函數(shù)名(參數(shù)表) {函數(shù)體};
舉例:
class Person { public virtual void XXX() { Console.WriteLine("我有一個夢想,那就是動身去往遠方!!"); } }
三.虛方法的調(diào)用:
調(diào)用上,使用子類構(gòu)造的對象調(diào)用虛方法,就會調(diào)用子類的方法,使用父類構(gòu)造的對象,就會調(diào)用父類的方法;(在規(guī)則 4 中有舉例說明)
1.在基類中聲明的虛方法一般在派生類中對其進行調(diào)用,會運用到base
關(guān)鍵字:
當(dāng)輸入訪問修飾符和override
后,系統(tǒng)會自己彈出我們剛才編寫的虛方法,直接進行選擇即可:
2.在運行時進行調(diào)用:
四.虛方法的規(guī)則:
1. 虛擬類其實指的是正常類中的虛擬方法,所以虛擬類可以直接使用實例,這是與抽象類不同的一點;
它不會像抽象類一樣進行報錯!!!
2. 虛擬方法是在方法前加virtual關(guān)鍵字,對方法進行聲明,說明這個方法為虛方法;
class Person { public virtual void XXX()//虛方法 { Console.WriteLine("我有一個夢想,那就是動身去往遠方!!"); } } class Boy : Person//繼承person { public override void XXX()//虛方法調(diào)用 { base.XXX(); } }
3. 虛擬函數(shù)和正常函數(shù)無區(qū)別;
4. 子類繼承虛擬類可以實現(xiàn)虛擬方法也可以不實現(xiàn)虛擬方法;
如下代碼所示,在調(diào)用虛方法時,對虛方法進行了重寫,這樣代碼執(zhí)行下來的就是子類的方法而不是父類的虛方法:::
class Person { public virtual void XXX() { Console.WriteLine("我有一個夢想,那就是動身去往遠方!!"); } } class Boy : Person { public override void XXX() { Console.WriteLine("我不想繼承父類的虛方法"); } public void SSS() { Console.WriteLine("不學(xué)習(xí)就不會進步,不僅不就沒有出人頭地的機會"); } } class Program { static void Main(string[] args) { Person person = new Person();//實例化的虛方法類 Boy boy = new Boy();//實例化的子類 boy.XXX();//調(diào)用了子類的方法 boy.SSS(); Console.ReadLine(); } }
結(jié)果如圖所示:
但是如果我們采用base
關(guān)鍵字進行調(diào)用的話就會有以下的結(jié)果:
public override void XXX() { base.XXX(); // Console.WriteLine("我不想繼承父類的虛方法"); }
結(jié)果如下:它調(diào)用了父類/基類的虛方法
5. 虛方法可以在不同的繼承類中有不同的實現(xiàn);
我們在以上案例中繼續(xù)進行添加調(diào)用虛方法:
class DD : Person { public override void XXX() { base.XXX(); Console.WriteLine("我是第一個繼承虛方法的"); } } class SS : Person { public override void XXX() { base.XXX(); Console.WriteLine("我是第二個繼承虛方法的"); } }
當(dāng)然別忘記實例化哦,我在這兒就不寫實例化的代碼了,但是千萬不能忘記哦!!??
運行結(jié)果:
五.虛方法注意事項:
- 一定要注意,只有為虛方法時可以進行重寫,不能對非虛方法進行重寫;
- 虛方法在形式上在方法名前加
virtual
修飾; - 虛方法一般在基類定義,在派生類中實現(xiàn)具體操作,派生類實現(xiàn)該方法時,要用
override
對其方法進行修飾; - 當(dāng)用
virtual
修飾后,不允許再有static
、abstract
或者override
修飾符;
六.虛方法的好處:
當(dāng)在基類中進行虛方法的定義以后,在派生類中可以對其方法進行調(diào)用,而且可以通過重寫來改變其中實現(xiàn)的功能來實現(xiàn)自己的一些功能,而不是虛方法時,必須重新聲明方法然后再進行自己想要的功能進行編寫然后再進行調(diào)用,但是虛方法只需要在派生類中對其進行調(diào)用,如果想實現(xiàn)其他的功能可以對其進行方法等的重寫,進而實現(xiàn)自己想要的功能,調(diào)用基類的虛方法來執(zhí)行派生類的具體操作。而在基類調(diào)用時,并不需要知道派生類是怎么樣實現(xiàn)的。因為不同的派生類可能實現(xiàn)的方式不一樣。但調(diào)用的方式是一樣的,實現(xiàn)了不同的功能
七.虛方法的作用:
1.允許 子類 / 派生類 進行重寫;
2.增加代碼的可維護性,脈絡(luò)較清淅有條理;
到此這篇關(guān)于C#中虛方法virtual詳解的文章就介紹到這了,更多相關(guān)C# 虛方法virtual內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.NET中實現(xiàn)彩色光標(biāo)、動畫光標(biāo)及自定義光標(biāo)的方法
這篇文章主要介紹了.NET中實現(xiàn)彩色光標(biāo)、動畫光標(biāo)及自定義光標(biāo)的方法,非常實用的功能,需要的朋友可以參考下2014-08-08C# 使用Microsoft Edge WebView2的相關(guān)總結(jié)
這篇文章主要介紹了C# 使用Microsoft Edge WebView2的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02.NET(C#):Emit創(chuàng)建異常處理的方法
.NET(C#):Emit創(chuàng)建異常處理的方法,需要的朋友可以參考一下2013-04-04C#獲取計算機硬件與操作系統(tǒng)的相關(guān)信息
這篇文章介紹了C#獲取計算機硬件與操作系統(tǒng)相關(guān)信息的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04C#條件編譯、內(nèi)聯(lián)函數(shù)、CLS介紹
這篇文章介紹了C#的條件編譯、內(nèi)聯(lián)函數(shù)、CLS,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03