使用 Override 和 New 關鍵字進資料列版本設定(C# 編程指南)

來源:互聯網
上載者:User
原文地址:點擊開啟連結



這具有多方面的意義。例如,這意味著在基類中引入與衍生類別中的某個成員具有相同名稱的新成員在 C# 中是完全支援的,不會導致意外行為。 它還意味著類必須顯式聲明某方法是要重寫一個繼承方法,還是一個隱藏具有類似名稱的繼承方法的新方法。

在 C# 中,衍生類別可以包含與基類方法同名的方法。

  • 基類方法必須定義為 virtual。

  • 如果衍生類別中的方法前面沒有 new 或 override 關鍵字,則編譯器將發出警告,該方法將有如存在 new 關鍵字一樣執行操作。

  • 如果衍生類別中的方法前面帶有 new 關鍵字,則該方法被定義為獨立於基類中的方法。

  • 如果衍生類別中的方法前面帶有 override 關鍵字,則衍生類別的對象將調用該方法,而不是調用基類方法。

  • 可以從衍生類別中使用 base 關鍵字調用基類方法。

  • override 、virtual 和 new 關鍵字還可以用於屬性、索引器和事件中。

如果某個方法被聲明為虛方法,則繼承該方法的任何類都可以實現它自己的版本。 若要使方法成為虛方法,必須在基類的方法聲明中使用 virtual 修飾符。 然後,衍生類別可以使用 override 關鍵字重寫基虛方法,或使用 new 關鍵字隱藏基類中的虛方法。 如果 override 關鍵字和 new 關鍵字均未指定,編譯器將發出警告,並且衍生類別中的方法將隱藏基類中的方法。

GraphicsClass 如下所示:

C#



class GraphicsClass{    public virtual void DrawLine() { }    public virtual void DrawPoint() { }}


您的公司使用此類,並且您在添加新方法時將其用來派生自己的類:

C#



class YourDerivedGraphicsClass : GraphicsClass{    public void DrawRectangle() { }}


您的應用程式運行正常,直到公司 A 發布了 GraphicsClass 的新版本,類似於下面的代碼:

C#




class GraphicsClass{    public virtual void DrawLine() { }    public virtual void DrawPoint() { }    public virtual void DrawRectangle() { }}


開始時,沒有出現任何問題。 新版本仍然與舊版本保持二進位相容。 已經部署的任何軟體都將繼續正常工作,即使新類已安裝到這些軟體所在的電腦系統上。 在您的衍生類別中,對方法 DrawRectangle 的任何現有調用將繼續引用您的版本。

此警告提示您必須考慮希望 DrawRectangle 方法在應用程式中的工作方式。

如果您希望自己的方法重寫新的基類方法,請使用 override 關鍵字:

C#



class YourDerivedGraphicsClass : GraphicsClass{    public override void DrawRectangle() { }}


派生自 YourDerivedGraphicsClass 的對象仍可以使用基關鍵字訪問DrawRectangle 的基類版本

C#


base.DrawRectangle();


為了避免這兩個方法之間發生混淆,可以重新命名您的方法。 這可能很耗費時間且容易出錯,而且在某些情況下並不可行。 但是,如果您的項目相對較小,則可以使用 Visual Studio 的重構選項來重新命名方法。 有關更多資訊,請參見重構類和類型(類別設計工具)。

或者,也可以通過在衍生類別定義中使用關鍵字 new 來防止出現該警告:

C#


class YourDerivedGraphicsClass : GraphicsClass{    public new void DrawRectangle() { }}


這是預設行為。

重寫和方法選擇

下面的方法將是相容的:

C#


public class Derived : Base{    public override void DoWork(int param) { }    public void DoWork(double param) { }}


重寫方法不被視為是在類上進行聲明的,而是在基類上聲明的方法的新實現。 僅當 C# 編譯器無法將方法調用與 Derived 上的原始方法匹配時,它才嘗試將該調用與具有相同名稱和相容參數的重寫方法匹配。 例如:

C#



int val = 5;Derived d = new Derived();d.DoWork(val);  // Calls DoWork(double).


有兩種方法可以避免此情況。 首先,避免將新方法聲明為與虛方法同名。 其次,可以通過將 Derived 的執行個體強制轉換為 Base 來使 C# 編譯器搜尋基類方法列表,從而使其調用虛方法。 由於是虛方法,因此將調用 Derived 上的 DoWork(int) 的實現。 例如:

C#


((Base)d).DoWork(val);  // Calls DoWork(int) on Derived.


有關 new 和 override的更多樣本,請參見 瞭解何時使用 Override 和 New 關鍵字(C# 編程指南)。

以上就是使用 Override 和 New 關鍵字進資料列版本設定(C# 編程指南)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.