繁体   English   中英

在基类中标记ToString虚拟,会发生什么?

[英]Marking ToString virtual in base class, what happens?

考虑以下(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();
  }
}

那就是在X创建一个名为ToString()虚拟方法,它隐藏了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"

打电话给

Console.WriteLine(y);

相当于最后一行,这就是打印类型名称的原因。

基本上,您的X.ToString方法应该覆盖 X.ToString object.ToString()方法:

public override String ToString() 
{
    return "Hi, I'm X";
}

通过在class X上使用virtual String ToString() ,您将“隐藏” object.ToString而不是覆盖它。

当你调用Console.WriteLine(y); ,它调用object.ToString() 由于您没有覆盖它,因此永远不会调用您的方法。

话虽这么说,编译器会警告你:

警告1'X.ToString()'隐藏继承的成员'object.ToString()'。 要使当前成员覆盖该实现,请添加override关键字。 否则添加新关键字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM