了解虚拟/覆盖

时间:2015-02-11 18:45:42

标签: c# inheritance

我认为我知道关键字的整体概念,但试图了解它如何应用于以下代码。无论我是否使用override / virtual(在方法GetTotal上),我都得到相同的值。

这笔交易是什么?覆盖/虚拟甚至适用于此,因为它们似乎没有做任何事情。

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();
    }
  }
}

1 个答案:

答案 0 :(得分:1)

这似乎源于对关键字缺乏了解... override用于修改类中标记为virtual的子类中的方法。家长。 virtual意味着无论如何转换实例,都会调用对象的派生类最多的子方法(只要子类提供标记为override的方法的版本)。

在上面的示例中,virtual从未执行任何操作,因为您将BankAccount存储为BankAccount,将ChaseAccount存储为ChaseAccount。但是,如果ChaseAccount被转换为BankAccount,那么当您致电GetTotal()时,它会将BankAccount GetTotal()完全天真地称为BankAccount实际上是ChaseAccount - 除非该方法已标记为virtual,以强制拨打ChaseAccount的GetTotal()版本(假设它已标记为override)。

I've made an illustration at Ideone