在基类中将 ToString 标记为 virtual,会发生什么?
请考虑以下 (LinqPad) 示例。类 X 中的 ToString 被标记为虚拟。为什么这里的输出不等于“Hi,I'm Y,Hi,I'm X”,而是打印类型名称?当然,将 ToString 标记为 virtual 是错误的,因为它在 Object 中定义为 virtual,我只是想了解这里发生了什么。
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();
}
}
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();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这就是在
X
中创建一个名为ToString()
的新虚拟方法,该方法隐藏了Object.ToString()
。因此,如果您有:调用 just
相当于最后一行,这就是打印类型名称的原因。
基本上,您的
X.ToString
方法应该覆盖object.ToString()
方法:That's creating a new virtual method in
X
calledToString()
which hidesObject.ToString()
. So if you have:Calling just
is equivalent to the final line, which is why the type name is printed.
Basically, your
X.ToString
method should override theobject.ToString()
method:通过在
class X
上使用virtual String ToString()
,您可以“隐藏”object.ToString
,而不是覆盖它。当您调用
Console.WriteLine(y);
时,它会调用object.ToString()
。由于您没有覆盖它,因此您的方法永远不会被调用。话虽这么说,编译器会警告你:
By using
virtual String ToString()
onclass X
, you're "hiding"object.ToString
instead of overriding it.When you call
Console.WriteLine(y);
, it callsobject.ToString()
. Since you didn't override this, your method never gets called.That being said, the compiler will warn you: