亚洲今日精彩视频_精品一级黄色_免费一级A片在现观看视频_8050福利视频 - 一级免费黄色片

7*24小時應(yīng)急電話:15927160396
首頁 新聞資訊 技術(shù)文章
C#中的三個關(guān)鍵詞new , virtual , override

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

以下是msdn中對newvirtualoverride的定義:

        使用 new 修飾符顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在派生類中聲明該成員,并用 new 修飾符修飾它。

         virtual 關(guān)鍵字用于修改方法或?qū)傩缘穆暶鳎谶@種情況下,方法或?qū)傩员环Q作虛擬成員。虛擬成員的實現(xiàn)可由派生類中的重寫成員更改。

調(diào)用虛方法時,將為重寫成員檢查該對象的運行時類型。將調(diào)用大部分派生類中的該重寫成員,如果沒有派生類重寫該成員,則它可能是原始成員。默認情況下,方法是非虛擬的。不能重寫非虛方法。

不能將 virtual 修飾符與以下修飾符一起使用:

static     abstract     override

        使用 override 修飾符來修改方法、屬性、索引器或事件。重寫方法提供從基類繼承的成員的新實現(xiàn)。由重寫聲明重寫的方法稱為重寫基方法。重寫基方法必須與重寫方法具有相同的簽名。

不能重寫非虛方法或靜態(tài)方法。重寫基方法必須是虛擬的、抽象的或重寫的。

重寫聲明不能更改虛方法的可訪問性。重寫方法和虛方法必須具有相同的訪問級修飾符。

不能使用下列修飾符修改重寫方法:

new    static     virtual    abstract

重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,并且重寫屬性必須是虛擬的、抽象的或重寫的。

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

BaseClass.cs

namespace NewVirtualOverride

{

    class BaseClass

     {

        public BaseClass()

         {

         }

        public void Print()

         {

            Console.WriteLine("BaseClassPrint");

         }

     }

}

InheritClass.cs

namespace NewVirtualOverride

{

    class InheritClass : BaseClass

     {

        public InheritClass():base()

         {

         }

        public void Print()

         {

            Console.WriteLine("InheritClassPrint");

         }

     }

}

GrandsonClass.cs

namespace NewVirtualOverride

{

    class GrandsonClass : InheritClass

     {

        public GrandsonClass():base()

         {

         }

        public void Print()

         {

            Console.WriteLine("GrandsonClassPrint");

         }

     }

}

最后是主程序Program:

namespace NewVirtualOverride

{

    class Program

     {

        static void Main(string[] args)

         {

            BaseClass baseclass = new BaseClass();

             baseclass.Print();

            InheritClass inheritClass = new InheritClass();

             inheritClass.Print();

            Console.ReadLine();

         }

     }

}

運行這個程序會得到如下的結(jié)果:

BaseClassPrint

InheritClassPrint

其實細心的朋友在編譯這個項目時,會發(fā)現(xiàn)出現(xiàn)了如下的警告提示:

大致意思是說,基類和繼承類中有相同名字的方法,請在繼承類中使用new來重新定義方法。這里的微妙之處在于,無論我們是隱式地指定new方法,還是顯式的指定,new方法都與基類中的方法無關(guān),在名稱、原型、返回類型和訪問修飾符方面都無關(guān)。

我們將程序中的Print()方法都變成new public void Print()后,上面的異常就不會發(fā)生了。再次運行程序,結(jié)果不變。new就是繼承類使用與基類方法相同的名字對基類方法的重寫。

下面我們看看virtual override的搭配使用方法。

BaseClass.cs改變?nèi)缦拢?/SPAN>public virtual void Print();

InheritClass.cs改變?nèi)缦拢?/SPAN>public override void Print();

運行程序,結(jié)果如下:

BaseClassPrint

InheritClassPrint

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

Program.cs改變?nèi)缦拢?/SPAN>

BaseClass baseclass = new BaseClass();

baseclass.Print();

InheritClass inheritClass = new InheritClass();

inheritClass.Print();

BaseClass bc = new InheritClass();

bc.Print();

分別運行用new修飾和用virtual/override修飾的程序,其結(jié)果如下:

new修飾的結(jié)果

BaseClassPrint

InheritClassPrint

BaseClassPrint

版權(quán)所有:武漢網(wǎng)福互聯(lián)科技有限公司    鄂ICP備09022096號
業(yè)務(wù)QQ:23444550 客服QQ:267052100 電郵:23444550@qq.com  

鄂公網(wǎng)安備 42010602000905號

手機站二維碼