2013-01-20 90 views
0

考慮下面的代碼片段:繼承例如

class BaseClass 
{ 
    public void SayHi() 
    { 
     Console.WriteLine("Hi from base class"); 
    } 

    public virtual void SayHello() 
    { 
     Console.WriteLine("Hello from base class"); 
    } 
} 

class DerivedClass : BaseClass 
{ 
    public void SayHi() 
    { 
     Console.WriteLine("Hi from derived class"); 
    } 

    public new void SayHello() 
    { 
     Console.WriteLine("Hello from derived class"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     BaseClass _object = new DerivedClass(); 

     _object.SayHi(); 
     _object.SayHello(); 

     Console.ReadKey(); 
    } 
} 

的輸出上面顯示:

Hi from base class 
Hi from derived class 

誰能請解釋我這背後的原因。另外,如果我們要在派生類中創建一個同名的方法,是否需要重寫基類的虛方法?

+0

你的輸出是錯誤的。這應該說'你好從基類'和'你好從基類'。 – Khan

回答

0

多態性的要點在於BaseClass類型的對象可以設置爲Derived類的實例,但具有不同的行爲[語義]。如果情況並非如此,那麼您將永遠無法將新的派生表單實例插入到Winforms框架中。

OP,你的定義是錯誤的。虛擬方法是啓用多態性。 new關鍵字的使用也是錯誤的,應該爲overridevirtual方法定義新行爲。

您的基類中的虛擬方法可以在您的基類中重寫,這樣即使您的變量類型爲BaseClass,您的重寫的虛擬方法也會在該變量上被調用。

+0

您正在查看OP的願望嗎?他想宣佈爲「新」。你有什麼反對嗎? –

+0

@Hamlet;完全沒有反對。我看到我可能沒有回答OP的確切問題....謝謝指出!這不是我第一次也不是最後一次因爲......而犯錯誤:/;) –