Mic*_*ent 3 c# virtual overriding
考虑以下(LinqPad)示例.X类中的ToString标记为虚拟.为什么这里的输出不等于"嗨,我是Y,嗨,我是X",而是打印出类型名称?当然标记ToString virtual是错误的,因为它在Object中定义为虚拟,我只是想了解这里发生了什么.
void Main()
{
Y y = new Y();
Console.WriteLine(y);
}
// Define other methods and classes here
class X
{
public virtual String ToString()
{
return "Hi, I'm X";
}
}
class Y : X
{
public override String ToString()
{
return "Hi, I'm Y, " + base.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 15
那就是在被叫中创建一个隐藏的新虚拟方法.所以如果你有:XToString()Object.ToString()
Y y = new Y();
X x = y;
Object o = y;
Console.WriteLine(y.ToString()); // Shows "Hi, I'm Y, Hi, I'm X";
Console.WriteLine(x.ToString()); // Shows "Hi, I'm Y, Hi, I'm X";
Console.WriteLine(o.ToString()); // Calls object.ToString; shows just "Y"
Run Code Online (Sandbox Code Playgroud)
打电话给
Console.WriteLine(y);
Run Code Online (Sandbox Code Playgroud)
相当于最后一行,这就是打印类型名称的原因.
基本上,您的X.ToString方法应该覆盖该object.ToString()方法:
public override String ToString()
{
return "Hi, I'm X";
}
Run Code Online (Sandbox Code Playgroud)
通过使用virtual String ToString()on class X,你"隐藏" object.ToString而不是覆盖它.
当你打电话时Console.WriteLine(y);,它会打电话object.ToString().由于您没有覆盖它,因此永远不会调用您的方法.
话虽这么说,编译器会警告你:
警告1'X.ToString()'隐藏继承的成员'object.ToString()'.要使当前成员覆盖该实现,请添加override关键字.否则添加新关键字.