2009-12-04 85 views
3

說我有以下層次:可以重寫一個隱藏的方法嗎?

public class MyClass 
{ 
    protected virtual void Method() { ... } 
} 

public class MySubClass : MyClass 
{ 
    public new virtual void Method() { ... } 
} 

public class MySubSubClass : MySubClass 
{ 
    // how do I reference the protected Method() to override it? 
} 

是否有可能重寫protected方法的實現(),以便從MyClass中定義的其他方法的調用被分派到在MySubSubClass實現?

如果不可能的話,很高興能夠被啓發爲什麼。

+0

你試過了嗎? – 2009-12-04 01:02:56

+0

你的方法需要類型;另外,我可能會誤解說明,但是您只是在尋找override關鍵字? – Matt 2009-12-04 01:05:58

+0

我嘗試過'protected override void Method()',導致語法錯誤「無法更改訪問權限」和「具有相同簽名的方法已被聲明」。我也嘗試過接口樣式'protected override void MyClass.Method()',這導致了三種不同的語法錯誤。 – 2009-12-04 01:13:45

回答

7

如果你試圖覆蓋MyClass定義,那麼版本的方法答案是你不能。 MySubClass中的定義隱藏了您的這個實現,您不可能進一步覆蓋它。

+0

愚蠢的後續?如果他壓倒了它,是否重要,因爲他取而代之呢? – Matt 2009-12-04 01:10:57

+1

@Matt:是的,儘管具有相同的名稱,但它們是兩個非常不同的功能。如果你調用'((MyClass)this).Method()'它會從'this.Method()'運行不同的代碼。 – 2009-12-04 01:15:17

+0

他只能隱藏MyClass中的方法,不能覆蓋它 - 如果MySubSubClass的一個實例被轉換爲MyClass,那麼被調用的Method()只能是MyClass中的一個,它不會被虛擬調度 – thecoop 2009-12-04 01:16:07

0

是的。您可以使用「新」關鍵字來重新引入您想要的任何方法。從那時起,每一次對「新」方法的呼叫都將被用於新的實現。

在這種情況下,Method()任何呼叫源自MyClass將使用MySubSubClass實現,只要有問題的對象類型的MySubSubClass

+0

我不確定我是否關注你。我知道我可以使用'new'來重新定義一個特定的方法名稱。我在MySubClass中做到了。但是由於它是'new',MyClass不知道它,並且*不會*發送給它。 – 2009-12-04 01:21:34

0

由於@Jared說,你不能。我只能假設你試圖避免再次使用new,因爲你想要正確處理virtual。你要管理這個的唯一方法是擺脫public new版本Method()並命名它別的東西。 new完全隱藏了可能存在於祖先對象中的任何版本的方法。

+0

謝謝,在閱讀Jared的答案時,重命名MySubClass.Method與我的結論是一樣的。順便說一句,我並不是想避免'新'。我不確定'new'的另一個用法是怎麼幫助的。我只想改變超類中被超類隱藏的方法的實現。 – 2009-12-04 01:24:06

1

,如果你標記您的隱藏方法也被虛擬,你可以重寫隱藏方法:

public new virtual void Method() 
相關問題