2013-12-11 24 views
2

由於親本三/子類,像這樣:重寫方法在多層次的繼承

class A { 
    public virtual void doSomething() { 
     //do things 
    } 
} 

class B : A { 
    public override /*virtual?*/ void doSomething() { 
     //do things 
     base.doSomething(); 
    } 
} 

class C : B { 
    public override void doSomething() { 
     //do things 
     base.doSomething(); 
    } 
} 

如果類BdoSomething()方法有其簽名都overridevirtual,因爲它也被覆蓋C類,或者應該只有類A在其doSomething()方法簽名中有virtual

+2

你試過這個代碼嗎? Visual Studio抱怨說「覆蓋方法不能被標記爲虛擬」。 –

+0

這很奇怪。它根本不抱怨我。 –

+0

如果你在'B'中取消註釋'/ * virtual * /',它會不會抱怨? –

回答

6

如果某個方法已經在其中一個超類中標記爲虛擬,則不需要(讀取:您不能)將方法標記爲虛擬方法。

該方法在整個繼承樹中保持虛擬狀態,直到子類將其標記爲sealed。密封的方法不能被任何子類覆蓋。

4

MSDN

您不能使用靜態,或虛擬修飾符 修改重寫方法。

此外,

重寫的基礎方法必須是虛擬抽象,或倍率

這意味着你可以可以覆蓋已被標記爲覆蓋的方法。