在基类中将 ToString 标记为虚拟,会发生什么? [英] Marking ToString virtual in base class, what happens?

查看:68
本文介绍了在基类中将 ToString 标记为虚拟,会发生什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

考虑以下 (LinqPad) 示例.X 类中的 ToString 被标记为虚拟.为什么这里的输出不等于我是 Y,我是 X",而是打印了类型名?当然将ToString标记为virtual是错误的,因为它在Object中定义为virtual,我只是想了解这里发生了什么.

Consider the following (LinqPad) example. ToString in class X is marked virtual. Why is the output here not equal to "Hi, I'm Y, Hi, I'm X" but instead the typename is printed? Of course marking ToString virtual is wrong, because it is defined in Object as virtual, I am just trying to understand what is happening here.

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()new 虚拟方法它隐藏了 Object.ToString().所以如果你有:

That's creating a new virtual method in X called ToString() which hides Object.ToString(). So if you have:

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);

相当于最后一行,这就是为什么要打印类型名称.

is equivalent to the final line, which is why the type name is printed.

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

Basically, your X.ToString method should override the object.ToString() method:

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

这篇关于在基类中将 ToString 标记为虚拟,会发生什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆