了解虚拟/覆盖

Understanding virtual / override

我以为我知道关键字的总体思路,但我想弄清楚它如何应用于以下代码。无论是否使用 override/virtual(在方法 GetTotal 上),我都会得到相同的值。

怎么回事? override/virtual 是否适用于此,因为他们似乎什么也没做。

namespace ConsoleApplication1
{
  class ChaseAccount : BankAccount
  {
    public override int GetTotal()
    {
      return Total * 1000;
    }
  }


  class BankAccount
  {
    public int Total { get; set; }
    public virtual int GetTotal()
    {
      return Total * 100;
    }

    public BankAccount Deposit(int n)
    {
      this.Total += n;
      return this;
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      // BankAccount
      BankAccount ba = new BankAccount();
      ba.Deposit(1000);
      Console.WriteLine(ba.GetTotal());


      Console.WriteLine("\n\n");

      // Chase
      ChaseAccount ca = new ChaseAccount();
      ca.Deposit(1000);
      Console.WriteLine(ca.GetTotal());


      Console.ReadLine();
    }
  }
}

这似乎源于对关键字缺乏理解... override用于修改子class中的方法,该方法在[中标记为virtual =29=]' parent。 virtual 表示无论实例如何转换,都会调用 object 最派生的 subclass 中的方法(只要 subclass 提供了一个版本标记为 override) 的方法。

在您上面的示例中,virtual 从未执行任何操作,因为您有一个存储为 BankAccount 的 BankAccount 和一个存储为 ChaseAccount 的 ChaseAccount。但是,如果将 ChaseAccount 转换为 BankAccount,那么当您调用 GetTotal() 时,它会调用 BankAccount 的 GetTotal() 完全天真地认为 BankAccount 实际上是一个 ChaseAccount - unless 该方法被标记为 virtual 以强制调用 ChaseAccount 版本的 GetTotal()(假设它被标记为 override)。

I've made an illustration at Ideone