2015-02-11 79 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