了解虚拟/覆盖
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
)。
我以为我知道关键字的总体思路,但我想弄清楚它如何应用于以下代码。无论是否使用 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
)。