2015-02-11 103 views
-3

我以为我知道关键字的总体思路,但试图让我的头如何适用于下面的代码。无论我使用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

Downvote - 继承的readup。你的覆盖代码和你的基类中的虚拟代码一样。当然,你会得到相同的结果。虚拟应该给你一个(可能的)基础实现,并且覆盖应该扩展或覆盖它。 – 2015-02-11 18:49:58

+0

我修改了我的问题。感谢大家好心告诉我更新我的帖子。 – SaltProgrammer 2015-02-11 18:50:23

+1

你仍然看到该代码的行为? – BradleyDotNET 2015-02-11 18:55:50

回答

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

+0

对不起,我的问题不清楚。感谢您的明确解释。 – SaltProgrammer 2015-02-11 19:03:31

+2

@SaltProgrammer - 不是问题!每个人对每个概念都至少有一次新的感觉......对它造成一种巨大的不满,IMO是没有意义的。 – Conduit 2015-02-11 19:05:36

+1

@SaltProgrammer增加了一个说明性的例子。 – Conduit 2015-02-11 19:11:21