c# – 在基类中标记ToString虚拟,会发生什么?
发布时间:2020-12-15 20:02:41 所属栏目:百科 来源:网络整理
导读:考虑以下( LinqPad)示例. X类中的ToString标记为虚拟.为什么这里的输出不等于“嗨,我是Y,嗨,我是X”,而是打印出类型名称?当然标记ToString virtual是错误的,因为它在Object中被定义为虚拟,我只是想了解这里发生了什么. void Main(){ Y y = new Y(); Console
考虑以下(
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,Hi,I'm X"; Console.WriteLine(x.ToString()); // Shows "Hi,I'm X"; Console.WriteLine(o.ToString()); // Calls object.ToString; shows just "Y" 打电话给 Console.WriteLine(y); 相当于最后一行,这就是打印类型名称的原因. 基本上,您的X.ToString方法应该覆盖object.ToString()方法: public override String ToString() { return "Hi,I'm X"; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |