C#中Override关键字和New关键字的用法详解

2019-12-30 11:35:14丽君
易采站长站为您分析C#中Override关键字和New关键字的用法,需要的朋友可以参考下  

C# 语言经过专门设计,以便不同库中的基类与派生类之间的版本控制可以不断向前发展,同时保持向后兼容。这具有多方面的意义。例如,这意味着在基类中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是完全支持的,不会导致意外行为。它还意味着类必须显式声明某方法是要重写一个继承方法,还是一个隐藏具有类似名称的继承方法的新方法。
在 C# 中,派生类可以包含与基类方法同名的方法。
基类方法必须定义为 virtual。

  • 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。
  • 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。
  • 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。

    可以从派生类中使用 base 关键字调用基类方法。

    override、virtual 和 new 关键字还可以用于属性、索引器和事件中。
    默认情况下,C# 方法为非虚方法。如果某个方法被声明为虚方法,则继承该方法的任何类都可以实现它自己的版本。若要使方法成为虚方法,必须在基类的方法声明中使用 virtual 修饰符。然后,派生类可以使用 override 关键字重写基虚方法,或使用 new 关键字隐藏基类中的虚方法。如果 override 关键字和 new 关键字均未指定,编译器将发出警告,并且派生类中的方法将隐藏基类中的方法。
    为了在实践中演示上述情况,我们暂时假定公司 A 创建了一个名为 GraphicsClass 的类,您的程序将使用此类。 GraphicsClass 如下所示:

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

    您的公司使用此类,并且您在添加新方法时将其用来派生自己的类:

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

    您的应用程序运行正常,直到公司 A 发布了 GraphicsClass 的新版本,类似于下面的代码:

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