淺析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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...