2013-12-13 71 views
1

我已經得到了有關多態方法的問題。我有兩個類別:基礎類與非虛方法Foo()它調用它的虛方法Foo (int i)(是這樣的:Foo() {Foo(1);})和派生類重寫方法Foo(int i)新VS覆蓋關鍵字

如果我稱之爲的一個實例Foo()方法派生類中的演練是爲以下幾點:base Foo() -> override Foo(int i)但如果我改變重寫方法,將新的演練是如下:base Foo -> base Foo(int i)它甚至沒有獲得新的Foo(int i)方法請解釋這些方法的順序和。爲什麼它的方式是。

using System; 
class Program 
{ 
    sealed void Main() 
    { 
     DerivedClass d = new DerivedClass(); 
     //Goes to BaseClass Foo() method 
     //then goes to Derived Foo(int i) method 
     d.Foo(); 
    } 
} 
class BaseClass 
{ 
    public void Foo() { Foo(1); } 
    public virtual void Foo(int i) { // do something; 
    } 
} 
class DerivedClass : BaseClass 
{ 
    public override void Foo(int i) { //Do something 
    } 
} 

//// ////////////////////////////////////////////////// ////////////////

using System; 
    class Program 
    { 
     sealed void Main() 
     { 
      DerivedClass d = new DerivedClass(); 
      //Goes to BaseClass Foo() method 
      //then goes to base Foo(int i) method 
      //never gets to Foo(int i) of the derived class 
      d.Foo(); 
     } 
    } 
    class BaseClass 
    { 
     public void Foo() { Foo(1); } 
     public virtual void Foo(int i) { // do something; 
     } 
    } 
    class DerivedClass : BaseClass 
    { 
     public new void Foo(int i) { //Do something 
     } 
    } 

回答

3

(當使用new

,它甚至沒有獲得新的Foo(int i)以法。

是它 - 但它因爲它不是在派生類中重寫執行BaseClass實施Foo(int)。這就是new的全部內容 - 它是這樣說的:「我不是重寫基類方法 - 我是一個全新的方法。」如果您想覆蓋基類方法,請使用override。線索是在關鍵字:)

使用因此,例如,當new

BaseClass x = new DerivedClass(); 
x.Foo(1); // Calls BaseClass.Foo(int) 

DerivedClass y = new DerivedClass(); 
y.Foo(1); // Calls DerivedClass.Foo(int) 

但在使用時override

BaseClass x = new DerivedClass(); 
x.Foo(1); // Calls DerivedClass.Foo(int) // Due to overriding 

DerivedClass y = new DerivedClass(); 
y.Foo(1); // Calls DerivedClass.Foo(int) 
+0

是不是像我們去的基類,並調用虛方法,然後我們檢查派生類中如果包含覆蓋方法,如果沒有我們實現基本虛擬方法? – user3101007

+0

@ user3101007:嗯,有點。這不是「去」基本方法的問題 - 它只是找到該方法的最派生類型實現,而「新」啓動一個* new *方法。 –

1

你可能想看看這個: http://msdn.microsoft.com/en-us/library/ms173153.aspx

開頭如下:

在C#,在派生類的方法可以有相同的名稱作爲在基類的方法 。您可以通過使用 新的和覆蓋關鍵字來指定方法的交互方式。覆蓋修飾符擴展基類 類方法,新修飾符隱藏它。不同之處在於本主題中的示例中所示的 。

此行爲是由設計。

+0

謝謝。你可以請建議一些關於多態性和虛擬方法表的內容,以便更詳細地瞭解它。因爲實際上我並沒有完全相同的機制。 – user3101007

+0

你可以嘗試像http://msdn.microsoft.com/en-us/library/ms173152.aspx或http://rbwhitaker.wikidot.com/c-sharp-abstract-classes – Dweeberly