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

2019-12-30 11:35:14丽君

由于变量 val 可以隐式转换为 double 类型,因此 C# 编译器将调用 DoWork(double),而不是 DoWork(int)。有两种方法可以避免此情况。首先,避免将新方法声明为与虚方法同名。其次,可以通过将 Derived 的实例强制转换为 Base 来使 C# 编译器搜索基类方法列表,从而使其调用虚方法。由于是虚方法,因此将调用 Derived 上的 DoWork(int) 的实现。例如:


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

何时使用 Override 和 New 关键字
在 C# 中,派生类中方法的名称可与基类中方法的名称相同。可通过使用 new 和 override 关键字指定方法互动的方式。 override 修饰符 extends 基类方法,且 new 修饰符将其“隐藏”起来。这种区别在本主题中的示例显示出来。
在控制台应用程序中,声明下面的 BaseClass 和 DerivedClass 两个类. DerivedClass 继承自 BaseClass。


class BaseClass
{
  public void Method1()
  {
    Console.WriteLine("Base - Method1");
  }
}

class DerivedClass : BaseClass
{
  public void Method2()
  {
    Console.WriteLine("Derived - Method2");
  }
}

在 Main 方法中,声明变量 bc、dc 和 bcdc。

  • bc 的类型为 BaseClass,并且其值的类型为 BaseClass。
  • dc的类型为 DerivedClass,并且其值的类型为 DerivedClass。
  • bcdc的类型为 BaseClass,并且其值的类型为 DerivedClass。这是要密切注意的变量。

    由于 bc 和 bcdc 具有类型 BaseClass,因此,除非您使用强制转换,否则它们只会直接访问 Method1。变量 dc 可以访问 Method1 和 Method2。下面的代码演示这些关系。

    
    class Program
    {
      static void Main(string[] args)
      {
        BaseClass bc = new BaseClass();
        DerivedClass dc = new DerivedClass();
        BaseClass bcdc = new DerivedClass();
    
        bc.Method1();
        dc.Method1();
        dc.Method2();
        bcdc.Method1();
      }
      // Output:
      // Base - Method1
      // Base - Method1
      // Derived - Method2
      // Base - Method1
    }
    
    

    接下来,将以下 Method2 方法添加到 BaseClass。此方法的签名与 DerivedClass 中 Method2 方法的签名相匹配。

    
    public void Method2()
    {
      Console.WriteLine("Base - Method2");
    }
    
    

    由于 BaseClass 现在有 Method2 方法,因此可以为 BaseClass 变量 bc 和 bcdc 添加第二个调用语句,如下面的代码所示。