[英]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.