2013-02-01 128 views
-2

可能重複:
C#: new versus override方法重載和方法隱藏

class BaseAppXmlLogReaders 
    { 
     public virtual void WriteLog() { } 
     public void Add() 
     { 
     } 
    } 
    class DerivedAppXmlLogReaders : BaseAppXmlLogReaders 
    { 
     public override void WriteLog() 
     { 

     } 
     public new void Add() 
     { } 
    } 

    class Demo 
    { 
     public static void Main() 
     { 
      BaseAppXmlLogReaders obj = new DerivedAppXmlLogReaders(); 
      obj.Add();//Call base class method 
      obj.WriteLog();//call derived class method   
     } 
    } 

我是小但是有點迷惑它使DerivedAppXmlLogReaders 的對象,但它調用Add()方法的基礎的方法派生類的類和WriteLog()方法。

+2

究竟是什麼問題? – Tikkes

+3

是的,你已經重寫了'WriteLog'並且隱藏了'Add'(以非多態的方式)。 –

+0

@Tikkes我創建派生類的對象,但它調用基類方法 – John

回答

0

這是因爲你把它當作BaseAppXmlLogReaders。如果使用以下行,則將調用派生類的Add方法。

var obj = new DerivedAppXmlLogReaders(); // or DerivedAppXmlLogReaders obj = ... 

編輯:

但是,你仍然可以調用派生類的這樣的方法:

(obj as DerivedAppXmlLogReaders).Add(); 
+0

classBase obj = new classDerived();意味着被貶斥的類的對象創建我對新的任何類infront然後創建該類的對象 – John

+0

我知道,但dervived類的成員將被隱藏。 – laszlokiss88

+0

爲什麼...我沒有得到請詳細說明 – John

0

如果你調用非虛方法,該類型的方法你是一個參考將被稱爲,在你的情況下BaseAppXmlLogReaders。如果您正在調用virtual方法,框架會將該調用指向「正確」,被重寫的方法。這就是爲什麼虛擬電話費用更低,爲什麼在99%的情況下,使用new是個好主意。我還沒有看到new的合理使用。

+0

classBase obj = new classDerived();意味着被創造的類的對象創建了我對新的任何類infront創建該類的對象 – John

+0

是的,但是,正如我所說的,非虛擬方法將指向classBase方法。這是一個事實,這是'新'的工作原理。 'Virtual'告訴運行時檢查實際實例中是否有重寫的方法,'new'方法被忽略,因爲基本方法不是'virtual'。關於類的'''''''密碼'關鍵字會告訴運行時它不必檢查重寫的方法,因爲不會有任何內容。如果你能控制基類,不要使用'new'。 – Jobo