2015-09-26 40 views
4

我想我有我懷念概念。我嘗試通過替換公共函數來覆蓋子類中的類的行爲。在下面的程序中,我期望將「B」寫入控制檯,但程序打印出「A」。我認爲哪裏錯了?我怎麼能實現它。 (在我的真實情況下,我不能改變A類)。隱藏成員函數不起作用

class Program 
    { 
     class A { public void F() { Console.WriteLine("A"); } } 
     class B : A { public new void F() { Console.WriteLine("B"); } } 

     static void Main(string[] args) 
     { 
      A x; 
      x = new B(); 
      x.F(); 
      Console.ReadLine(); 
     } 
    } 
+0

如果你想讓它工作,你必須聲明F爲虛擬 – BlackBear

+0

如果你想了解更多關於隱藏的知識,我推薦閱讀:[link](http://www.codeproject.com/Articles/18733/方法隱藏式-C)。 – aloisdg

+0

因爲'x'是類型'A'(即使它用'B'初始化),編譯器首先在那裏搜索函數,然後它會運行A.F()函數。如果該功能直接在該類型上運行,則只隱藏該成員。通過用派生類型和隱藏函數覆蓋它,然後將它傳遞給基類型的操作,你不能真正將功能注入到基類型中,它不會像那樣工作。 –

回答

3

的期望的行爲可以通過使用virtual方法和在如下覆蓋它來獲得;請注意0​​關鍵字。

class Program 
{ 
    class A { public virtual void F() { Console.WriteLine("A"); } } 
    class B : A { public override void F() { Console.WriteLine("B"); } } 

    static void Main(string[] args) 
    { 
     A x; 
     x = new B(); 
     x.F(); 
     Console.ReadLine(); 
    } 
} 

如果你碰巧有一個Java的背景,請注意,這種類型的繼承是Java的默認行爲,但在C#中有明確聲明。