我认为我知道关键字的整体概念,但试图了解它如何应用于以下代码。无论我是否使用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();
}
}
}
答案 0 :(得分:1)
这似乎源于对关键字缺乏了解... override
用于修改类中标记为virtual
的子类中的方法。家长。 virtual
意味着无论如何转换实例,都会调用对象的派生类最多的子方法(只要子类提供标记为override
的方法的版本)。
在上面的示例中,virtual
从未执行任何操作,因为您将BankAccount存储为BankAccount,将ChaseAccount存储为ChaseAccount。但是,如果ChaseAccount被转换为BankAccount,那么当您致电GetTotal()
时,它会将BankAccount GetTotal()
完全天真地称为BankAccount实际上是ChaseAccount - 除非该方法已标记为virtual
,以强制拨打ChaseAccount的GetTotal()
版本(假设它已标记为override
)。