日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

谈谈C#中的三个关键词new , virtual , override(装载 Winner.Net)

發(fā)布時(shí)間:2023/12/18 C# 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谈谈C#中的三个关键词new , virtual , override(装载 Winner.Net) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C#支持單繼承,說到繼承就不得不說new,virtual和override這三個(gè)關(guān)鍵詞,靈活正確的使用這三個(gè)關(guān)鍵詞,可以使程序結(jié)構(gòu)更加清晰,代碼重用性更高。?
???

????? 以下是msdn中對(duì)new,virtual和override的定義:
????? 使用 new 修飾符顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請(qǐng)使用相同名稱在派生類中聲明該成員,并用 new 修飾符修飾它。
??????virtual 關(guān)鍵字用于修改方法或?qū)傩缘穆暶?#xff0c;在這種情況下,方法或?qū)傩员环Q作虛擬成員。虛擬成員的實(shí)現(xiàn)可由派生類中的重寫成員更改。調(diào)用虛方法時(shí),將為重寫成員檢查該對(duì)象的運(yùn)行時(shí)類型。將調(diào)用大部分派生類中的該重寫成員,如果沒有派生類重寫該成員,則它可能是原始成員。默認(rèn)情況下,方法是非虛擬的。不能重寫非虛方法。
????? 不能將virtual 修飾符與以下修飾符一起使用:
????? static??? abstract??? override
????? 使用 override 修飾符來修改方法、屬性、索引器或事件。重寫方法提供從基類繼承的成員的新實(shí)現(xiàn)。由重寫聲明重寫的方法稱為重寫基方法。重寫基方法必須與重寫方法具有相同的簽名。不能重寫非虛方法或靜態(tài)方法。重寫基方法必須是虛擬的、抽象的或重寫的。
????? 重寫聲明不能更改虛方法的可訪問性。重寫方法和虛方法必須具有相同的訪問級(jí)修飾符。
????
????? 不能使用下列修飾符修改重寫方法:
????? new?? static??? virtual?? abstract
????? 重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,并且重寫屬性必須是虛擬的、抽象的或重寫的。?
????? 可以稍微歸納一下:
????? 1. 對(duì)于基類中說明為虛的方法則必須在派生類中new或者override(注:對(duì)于基類的虛方法,雖然你在派生類中即不new也不override,但系統(tǒng)還是會(huì)提示你添關(guān)鍵字。否則系統(tǒng)將視其為隱藏。我們的意思是一樣的,但總覺得明明確確寫上關(guān)鍵字還是好些)。
????? 2. 如果用基類指針指向派生類對(duì)象的方式,動(dòng)態(tài)匹配的源動(dòng)力是virtual,而new和override都會(huì)阻止這種向下尋求匹配的行為,所以要使虛函數(shù)的性質(zhì)得已保持下去,就要隱藏基類的虛方法,即在派生類中隱藏基類虛方法時(shí),同時(shí)加以virtual關(guān)鍵字,使在多層次繼承中能夠調(diào)用到對(duì)象自身的版本。
????? 3.在多層次繼承中,三個(gè)關(guān)鍵字使用次序有限定,new沒有使用前提,即不管是普通方法、虛方法還是重寫了的方法。virtual的使用,在它的基類不能有函數(shù)簽名相同的方法,否則系統(tǒng)將提示添加new,即隱藏基類中的方法。virtual一般只出現(xiàn)一次,除非要在子類中隱藏父類的虛方法。

????? override的使用是為了重寫基類虛方法。
?????

  上面的描述都很抽象,對(duì)于初學(xué)者可能不好理解,下面我將用示例來說明這三個(gè)用法和區(qū)別:此程序在vs2005下調(diào)試通過。其中有三個(gè)類,分別

為基類BaseClass,繼承類InheritClass和繼承類的繼承類GrandsonClass代碼分別如下:

  


//BaseClass.cs
namespace NewVirtualOverride
{
class BaseClass
{
public BaseClass()
{
}
publicvoid Print()
{
Console.WriteLine("BaseClassPrint");
}
}
}
//InheritClass.cs
namespace NewVirtualOverride
{
class InheritClass : BaseClass
{
public InheritClass():base()
{
}
publicvoid Print()
{
Console.WriteLine("InheritClassPrint");
}
}
}
//GrandsonClass.cs
namespace NewVirtualOverride
{
class GrandsonClass : InheritClass
{
public GrandsonClass():base()
{
}
publicvoid Print()
{
Console.WriteLine("GrandsonClassPrint");
}
}
}
//最后是主程序Program:
namespace NewVirtualOverride
{
class Program
{
staticvoid Main(string[] args)
{
BaseClass baseclass =new BaseClass();
baseclass.Print();
InheritClass inheritClass =new InheritClass();
inheritClass.Print();
Console.ReadLine();
}
}
}
運(yùn)行這個(gè)程序會(huì)得到如下的結(jié)果: BaseClassPrint InheritClassPrint 其實(shí)細(xì)心的朋友在編譯這個(gè)項(xiàng)目時(shí),會(huì)發(fā)現(xiàn)出現(xiàn)了如下的警告提示:

?


class InheritClass:BaseClass
{
public InheritClass():base()
{}

//New Virtual Override InheritClass.Print()隱藏了繼承的成員
//New Virtual Override BaseClass.Print()。如果是刻意隱藏請(qǐng)使用new
publicvoid Print()
{
Console.WriteLine("Hello");
}
}
大致意思是說,基類和繼承類中有相同名字的方法,請(qǐng)?jiān)诶^承類中使用new來重新定義方法。這里的微妙之處在于,無論我們是隱式地指定new方法,還是顯式的指定,new方法都與基類中的方法無關(guān),在名稱、原型、返回類型和訪問修飾符方面都無關(guān)。 我們將程序中的Print()方法都變成new public void Print()后,上面的異常就不會(huì)發(fā)生了。再次運(yùn)行程序,結(jié)果不變。new就是繼承類使用與基類方法相同的名字對(duì)基類方法的重寫。 下面我們看看virtual 和 override的搭配使用方法。 把BaseClass.cs改變?nèi)缦?#xff1a;public virtual void Print(); 把InheritClass.cs改變?nèi)缦?#xff1a;public override void Print(); 運(yùn)行程序,結(jié)果如下: BaseClassPrint InheritClassPrint

?

???? 雖然結(jié)果與用new修飾符差不多,,但是其中的含意可不同,new是繼承類對(duì)基類方法的重寫而在繼承類中產(chǎn)生新的方法,這時(shí)基類方法和繼承方法之間沒有任何的關(guān)系了,可是override就不同了,它也是對(duì)基類中方法的重寫,但此時(shí)只是繼承類重寫了一次基類的方法。可以參考下面的例子來加深理解。

將Program.cs改變?nèi)缦?#xff1a;

?


BaseClass baseclass =new BaseClass();
baseclass.Print();
InheritClass inheritClass =new InheritClass();
inheritClass.Print();
BaseClass bc =new InheritClass();
bc.Print();
分別運(yùn)行用new修飾和用virtual/override修飾的程序,其結(jié)果如下: ??? 用new修飾的結(jié)果: BaseClassPrint InheritClassPrint BaseClassPrint ??? 用virtual/override修飾的結(jié)果: BaseClassPrint InheritClassPrint InheritClassPrint 從上面的結(jié)果可以看出,在用new修飾的情況下,雖然bc是用InheritClass創(chuàng)建的實(shí)例,但是bc.Print()打印的還是BaseClassPrint,因?yàn)榇藭r(shí)BaseClass和InheritClass中的Print已經(jīng)是互不相同沒有關(guān)系的兩個(gè)方法了,而在virtual/override修飾的情況下,bc調(diào)用的Print方法已經(jīng)被其子類override了,所以就打印了InheritClassPrint。

?最后我們?cè)僬f說關(guān)鍵詞之間的搭配關(guān)系,上面已經(jīng)給出了virtual和override不兼容的幾個(gè)關(guān)鍵詞,這里就不重復(fù)了。我要說的是new和virtual在聲明函數(shù)時(shí),其實(shí)可以一塊使用。因?yàn)檫@個(gè)函數(shù)是新的,故與其它任何new函數(shù)一樣,隱藏了具有相同原型的繼承來的函數(shù)。因?yàn)檫@個(gè)函數(shù)也是虛擬的,所以可以在派生類中進(jìn)一步復(fù)位義,這樣就為這個(gè)虛擬函數(shù)建立了一個(gè)新的基級(jí)別。最后用GrandsonClass類來看看。


將GrandsonClass.cs修改如下:
namespace NewVirtualOverride
{
class GrandsonClass : InheritClass
{
public GrandsonClass():base()
{
}
publicoverridevoid Print()
{
Console.WriteLine("GrandsonClassPrint");
}
}
}
InheritClass.cs修改如下:
namespace NewVirtualOverride
{
class InheritClass : BaseClass
{
public InheritClass():base()
{
}
newpublicvirtualvoid Print()
{
Console.WriteLine("InheritClassPrint");
}
}
}
BaseClass.cs修改如下:
namespace NewVirtualOverride
{
class BaseClass
{
public BaseClass()
{
}
publicvirtualvoid Print()
{
Console.WriteLine("BaseClassPrint");
}
}
}
Program.cs修改如下:
namespace NewVirtualOverride
{
class Program
{
staticvoid Main(string[] args)
{
BaseClass baseclass =new BaseClass();
baseclass.Print();

InheritClass inheritClass =new InheritClass();
inheritClass.Print();

BaseClass grandsonClass =new GrandsonClass();
grandsonClass.Print();\
Console.ReadLine();
}
}
}

?

運(yùn)行結(jié)果為: BaseClassPrint InheritClassPrint BaseClassPrint 可見在InheritClass中使用了new以后,就意味著它與基類的同名方法為兩個(gè)不同方法了,而它又是虛擬的,所以它的子類還可以繼續(xù)繼承BaseClass的Print()方法。 將函數(shù)聲明為virtual 與將它聲明為new virtual是一樣的,因?yàn)閚ew仍然是默認(rèn)的。所以下面的兩句是相同的: public new virtual void Print();?public virtual void Print(); 那么new virtual的意義又在什么地方呢?在大型的層次結(jié)構(gòu)中,這可能很有用,比如如下的System.Windows.Form類的繼承關(guān)系Object->MarshalByRefObject->Component->Control->ScrollableControl-> ContainerControl。 很容易想象出將一個(gè)派生的窗體集合作為窗體對(duì)待,而不是作為Object的情形。 再將Program.cs修改如下:
namespace NewVirtualOverride
{
class Program
{
staticvoid Main(string[] args)
{
BaseClass baseclass =new BaseClass();
baseclass.Print();
InheritClass inheritClass =new InheritClass();
inheritClass.Print();
BaseClass grandsonClass1 =new InheritClass();
grandsonClass1.Print();
InheritClass grandsonClass2 =new GrandsonClass();
grandsonClass2.Print();
Console.ReadLine();
}
}
}

?

運(yùn)行結(jié)果為: BaseClassPrint InheritClassPrint BaseClassPrint GrandsonClassPrint

轉(zhuǎn)載于:https://www.cnblogs.com/zhcw/archive/2012/06/27/2565321.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的谈谈C#中的三个关键词new , virtual , override(装载 Winner.Net)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。