2011-01-11 143 views
3

我有三個類。C#繼承虛擬或覆蓋

人 - >員工 - >經理

人宣佈爲

public virtual void saySomething() 

內部員工的我有

public virtual void saySomething() 

OR

public override void saySomething() 

和虛擬方法一世 獲得相同的行爲

內部經理的我有

public override void saySomething() 

我感到困惑的事實,我可以使用覆蓋的虛擬更換?我以爲你用override來表示這個類已經重寫了一個基類函數。

如何阻止方法被重寫?這是最後一種方法。

回答

8

在子類中添加public virtual void saySomething()重新聲明該方法(方法隱藏;您可能會收到有關該方法的警告)。

這將具有相同的行爲,如果你訪問它:

Employee emp = ... 
emp.saySomething(); 

但現在加:

Person per = emp; 
per.saySomething(); 

隨着多態性(通過override)他們應該做同樣的事情。但通過方法隱藏他們不會。爲了明確隱藏的方法,用new

new public virtual void saySomething() {...} 

停止東西正在被超越任何進一步的使用sealed

public sealed override void saySomething() {...} 
2

可以使用sealed關鍵字停止虛擬存在在繼承層次結構中進一步覆蓋。

您使用倍率是Employee正確的,你想覆蓋Person提供的默認實現。 virtual中的Employee類型爲saySomething方法不正確。

1

您必須使用sealed關鍵字。