使用 Override 和 New 關鍵字進行版本控制(C# 程式設計指南)

黄舟
發布: 2017-02-16 10:58:17
原創
1523 人瀏覽過

原文網址:點選開啟連結



 這具有多面向的意義。例如,這意味著在基類中引入與衍生類別中的某個成員具有相同名稱的新成員在 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() { }
}
登入後複製


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

reee


您的應用程式運作正常,直到公司A 發布了 
GraphicsClass

 的新版本,類似下面的程式碼:


C#

開始時,沒有出現任何問題。

 

新版本仍然與舊版本保持二進位相容。

 
已經部署的任何軟體都將繼續正常運作,即使新類別已安裝到這些軟體所在的電腦系統上。

 

在您的衍生類別中,對方法 
DrawRectangle

 的任何現有呼叫將繼續引用您的版本。


 

此警告提示您必須考慮希望 

DrawRectangle 方法在應用程式中的工作方式。 如果您希望自己的方法重寫新的基類方法,請使用 override 關鍵字:C#

C#

C#

C#



C#

 派生自 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# 编程指南)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!