簡體   English   中英

C#ToString繼承

[英]C# ToString inheritance

我有一個問題(這是我的錯,我只是無法發現我做錯了什么)“ToString”沒有調用正確的方法......

public class ClassA
{
   public override ToString()
   {
      return "Hello, I'm class A.";
   }
}

public class ClassB : ClassA
{
   public override ToString()
   {
       return "Hello, I'm class B.";
   }
}

ClassB myClassB = new ClassB();
List<ClassA> myClassAList = new List<ClassA>();

myClassAList.Add((ClassA) myClassB);
ClassA tempClassA = myClassAList[0];
Console.WriteLine(tempClassA.ToString());

我從“ClassB”而不是“ClassA”得到“ToString”我做錯了什么?

你沒有做錯任何事 - 這就是多態虛擬方法的工作原理。 將ClassB放入ClassA引用的集合時,它仍然是ClassB對象。 如果對象確實是ClassB,則調用.ToString()將始終找到ClassB.ToString()。

您在ClassB中重寫ToString而不是將其隱藏在原始文件中,這將導致重寫的方法優先。 你能做的是......

public class ClassA
{
    public override string ToString()
    {
        return "Hello, I'm class A.";
    }
}

public class ClassB : ClassA
{
    public new string ToString()
    {
        return "Hello, I'm class B.";
    }
}

...

List<ClassA> theList = new List<ClassA>
{
    (ClassA)new ClassB(),
    (ClassA)new ClassB()
};

ClassA a = theList[0];
Console.WriteLine(a.ToString());

// OR... 

Console.WriteLine(new ClassA().ToString());  // I'm Class A
Console.WriteLine(new ClassB().ToString());  // I'm Class B
Console.WriteLine(((ClassA)new ClassB()).ToString()); // I'm Class A

ToString是一個虛方法,它與變量的類型無關,重要的是實際對象的類型。

如果該方法不是虛擬的,則調用將轉到編譯器將要知道的方法,該方法將是ClassA ToString方法。

虛方法通過查找表實現,綁定到對象類型。 由於您在變量“tempClassA”中最終得到的對象實際上是ClassB類型的對象,因此使用ClassB的查找表,因此使用該類的ToString方法。

您獲得了正確的結果。 您將ClassB的實例添加到列表中; 即使你把它當作ClassA。 因此,當您調用虛擬ToString方法時,它將導致調用ClassB的ToString; 因為這是你正在使用的實際對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM