淺析C#中new、override、virtual關鍵字的區別

来源:http://www.cnblogs.com/androidshouce/archive/2016/06/12/5576483.html
-Advertisement-
Play Games

OO思想現在已經在軟體開發項目中廣泛應用,其中最重要的一個特性就是繼承,最近偶簡單的複習了下在C#中涉及到繼承這個特性時,所需要用到的關鍵字,其中有一些關鍵點,特地整理出來,方便大家查閱。 一、在C#中,new這個關鍵字使用頻率非常高,主要有3個功能: a) 作為運算符用來創建一個對象和調用構造函數 ...


OO思想現在已經在軟體開發項目中廣泛應用,其中最重要的一個特性就是繼承,最近偶簡單的複習了下在C#中涉及到繼承這個特性時,所需要用到的關鍵字,其中有一些關鍵點,特地整理出來,方便大家查閱。

一、在C#中,new這個關鍵字使用頻率非常高,主要有3個功能:    

a)     作為運算符用來創建一個對象和調用構造函數。

b)     作為修飾符。

c)      用於在泛型聲明中約束可能用作類型參數的參數的類型。

    在本文中,只具體介紹new作為修飾符的作用,在用作修飾符時,new關鍵字可以在派生類中隱藏基類的方法,也就說在使用派生類的方法是調用的方法是New關鍵字新定義出來的方法,而不是基類的方法。在不使用New關鍵字來隱藏基類方法也是可以的,編譯器會出現一個警告,提示如果有意去隱藏基類的方法,請使用New關鍵字修飾。

這裡有個註意事項就是New和Override這兩個關鍵字是互斥的。不可以同時使用。

二、    Override關鍵字主要是提供派生類對基類方法的新實現,重寫的基類方法必須和Override的方法具有相同的簽名,此關鍵字不可以用於重寫非虛方法和靜態方法,與其配套使用的關鍵字是Virtual、abstract、Override。與此同時,Override方法還不可以修改Virtual方法的可訪問性,Override方法和Virtual方法必須具有相同的訪問修飾符,不能使用修飾符 new、static、virtual 或abstract 來修改 override 方法。

以下是一個小demo,展示了new和override的本質區別:

 

class Program

    {

        static void Main(string[] args)

        {         

            class1 ct1 = new class1();

            contact ct2 = new class2();

            ct1.prinf();

            ct2.prinf();

        }

    }

    abstract public class contact

    {

        public virtual void prinf()

        {

            Console.WriteLine ("這是虛方法");

        }

    }

    public class class1 : contact

    {

        public override void prinf()

        {

            Console.WriteLine ("這是新的方法");

        }

    }

    public class class2 : contact

    {

        public new void prinf()

        {

            Console.WriteLine ("這是另一個新的方法");

        }

}

此demo運行結果為:

這是新的方法

這是虛方法

三、     Virtual 關鍵字允許在派生類中重寫這些對象,預設情況下,方法是非虛擬的,不可以重寫非虛方法,virtual關鍵字不可以與static、abstract、private、override一起使用。Virtual關鍵字又是和override緊密不可分的,如果要實現Virtual方法就必須要使用override或new關鍵字(new和override產生的機理不同)。

總結:New關鍵字主要用來區別派生類和基類同名方法的選擇問題,通過隱藏基類方法,達到使編譯器調用正確的方法的目的。Override主要用來對基類的方  
               法和虛方法進行重寫。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • linux系統中通過chmod來修改文件和目錄許可權,其中要非常註意文件和目錄許可權各自的含義和差別。 ...
  • 所有可能的設置:新建一個文件夾,將它命名為“some_name.{ED7BA470-8E54-465E-825C-99712043E01C}”,打開就是這臺電腦的所有設置視窗【所有的設置視窗都在桌面的文件夾里】 雙擊鎖住電腦:在桌面上新建一個快捷方式,在鍵入項目的地址上輸入“rundll32.exe ...
  • Let's Encrypt是一個免費SSL證書發行項目,發行的證書已經獲得主流瀏覽器的支持,親測谷歌瀏覽器(桌面版)、火狐瀏覽器(桌面版)、UC瀏覽器(手機版)、360瀏覽器(手機版)支持,其它的暫沒測試; 本文講解如何使用Let's Encrypt獲得免費SSL證書,配置apache的SSL功能, ...
  • 源內容:http://www.cnblogs.com/shouce/p/5558095.html#undefined 下麵的內容是根據“源內容”進行了整改、補充。 三種方式實例化一類,包括無參數構造形式與有參數構造形式性能測試。 測試環境: 1) Visual studio 2015 Communi ...
  • 先收藏,後看;千萬不要做一個屯書的人,一定要堅持有選擇性的看下去; 資料庫類 資料庫類 SqlServer Oracle .NET 更多... .NET 更多... Web 更多... Web 更多... 架構 架構 不颳了,直接可以看到了。 鏈接: http://pan.baidu.com/s/1 ...
  • 近期都在處理淘寶商品數據包識別問題,滿以為CSV文件就是以行為分割,以逗號為欄位分割的文件體系。 自己在編寫處理程式時,增加了2個參數: 第一個,字元集,第二,告知處理方法,文件的列在第幾行。 同時,對某些生成出來的數據包不規據的,例如生成出2個同名列的,等等文件,做了一定的容錯。 滿以為這樣就OK ...
  • 前言 在前一篇文章中我已經做過開篇,接下來的隨筆會詳細講一下我們的開發框架是如何實現的,專業的事由專業的人來講,以後就由我們的高級碼農小李英文名查爾斯和他的師父廠長(因為姓陳,酷愛攝影,我們的文藝片都是從他那裡來的,所以叫廠長) 技術選型 “查爾斯,這個敏捷開發框架我們要開始做了,給你分點任務,你要 ...
  • 這篇教程將告訴你如何使用 Visual Studio 2015 構建一個 ASP.NET Core MVC Web 應用程式的基礎知識。 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...