2015-06-30 16 views
0

我有一個具有長鏈繼承的基類。我使用基類的類型在變量中傳遞子類的實例。我可以對子類的實例做一個ToString,並讓孩子的ToString運行(不是父母)嗎?在C語言中使用父類的ToString而不用在C語言中強制轉換

這裏是我的嘗試:

namespace Abc 
{ 
    class A 
    { 
     string strA = "A"; 
     public virtual string ToString() { return strA; } 
    } 
    class B : A 
    { 
     string strB = "B"; 
     public virtual string ToString() { return base.ToString() + strB; } 
    } 
    class C : B 
    { 
     string strC = "C"; 
     public virtual string ToString() { return base.ToString() + strC; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      A a = new C(); 
      System.Console.WriteLine(a.ToString()); 
      System.Console.ReadLine(); 
     } 
    } 
} 

這個節目輸出A。我認爲添加virtual關鍵字會讓它輸出ABC。如何在不投射的情況下得到這個結果?在編譯時Casting需要我知道類型。

+2

它已經是虛擬的。你不是說重寫? –

回答

3

你不需要在每個級別聲明virtual,你只需要在聲明它的類中這樣做,子類應該做override來代替。由於ToString()Object定義是什麼A被隱式地從全部關閉你的類衍生應該只使用override

class A 
{ 
    string strA = "A"; 
    public override string ToString() { return strA; } 

    //Added a example of somthing not declared in Object 
    public virtual string Example() { return "I am in A!"; } 
} 
class B : A 
{ 
    string strB = "B"; 
    public override string ToString() { return base.ToString() + strB; } 

    //Notice the override instead of the virtual. 
    public override string Example() { return "I am in B!"; } 
} 
class C : B 
{ 
    string strC = "C"; 
    public override string ToString() { return base.ToString() + strC; } 

    public override string Example() { return "I am in C!"; } 
} 

是什麼原因導致你的錯誤是你在哪裏ShadowingToString(),你應該得到一個編譯器警告,告訴您你在哪裏這樣做,你需要使用new關鍵字來擺脫編譯器警告,並明確指出你想影子而不是覆蓋該方法。