2011-11-08 23 views
1
class clsTestParent 
    { 
     public void testNoAbstract() 
     { 
      Console.WriteLine("Parent Method Call"); 
     } 
    } 

    class clsDerivedTest : clsTestParent 
    { 
    public void testNoAbstract() 
     { 
      Console.WriteLine("Child Method Hiding Parent Method"); 
     } 
    } 

      clsTestParent objParent = new clsTestParent(); 
      clsTestParent objOfParentFromDerived = new clsDerivedTest(); 
      clsDerivedTest objDerived = new clsDerivedTest(); 

      objParent.testNoAbstract(); 
      objOfParentFromDerived.testNoAbstract(); 
      objDerived.testNoAbstract(); 

輸出:
父方法調用
父方法調用
子方法隱藏父方法爲什麼我需要聲明一個虛擬方法時,我可以在派生類中隱藏它

但是當我宣佈testNoAbstract()爲派生類中的虛擬和超車時,輸出將如下:

Parent Method Call 
Child Method Hiding Parent Method 
Child Method Hiding Parent Method 

早些時候我曾經認爲,如果定義爲abstractvirtual,我們只能重新定義派生類中的方法,但正如現在可以看到的,我們可以通過在派生類中重新定義它來隱藏父類方法。

雖然,我可以看到,通過更改代碼的輸出差異,我想知道,上述兩種方法之間有什麼區別,以及它爲什麼會產生不同的輸出。

回答

3

如果你會永遠做clsTestParent a = new clsDerivedTest() - 你永遠能夠執行一個在clsDerivedTest類!!!!

多數民衆贊成差異,這就是爲什麼編譯器警告你。

如果你想要預製一個多態體系結構,你實際上會這麼做。

微軟告訴你:「聽着,你指揮了一堂課,我們會給你所有的公共事物等,但我們不知道你想如何實現這些方法......如果你將使用虛擬+覆蓋 - 你可以通過instace類型執行不同的方法,如果你不會覆蓋 - 所以父親的功能將永遠執行....它的選擇...我們警告你「...並且他們警告

2

這就是爲什麼'重新定義'對此有些不好。虛擬呼叫解決您的類型的運行時,這就是爲什麼你能:

clsTestParent objOfParentFromDerived = new clsDerivedTest(); 
    objOfParentFromDerived.testAbstractOrVirtual(); // marked as virtual or abstract in base class 

,呼叫在運行時得到解決,在一個類中定義的方法objOfParentFromDerived真的是(new運營商 - clsDerivedTest),而不是在(clsTestParent)聲明的類中定義的方法。

如果它既沒有標記也沒有標記爲virtualabstract那麼編譯器會警告你,因爲這個調用將根據變量聲明的類型來解析。

相關問題