如何在静态类中重写ToString方法?

11

我有一个公共静态类,我想在其中添加一个ToString()方法。

我将其定义为public static string ToString(),但收到以下警告:

“Class.ToString()”隐藏了继承的成员“object.ToString()”。 要使当前成员覆盖该实现,请添加override关键字。否则添加new关键字。

如果我添加override关键字,我会得到以下错误:

静态成员“Class.ToString()”不能标记为override,virtual或abstract

如何摆脱这个警告并让我的静态类拥有ToString()方法。

谢谢,
Keith


我可以问一下你为什么想要这样做吗?(只是好奇) - StingyJack
我有一个 ErrorLog,它是一个静态类,在我的代码中,我可以将 ErrorLogItem 添加到 ErrorLog 中。ErrorLog 可以通过保存所有 ErrorLogItems 将自己保存到数据库中。如果数据库不可访问(出现重大错误),我可以将整个日志转换为字符串并保存到磁盘上。 - Keith Sirmons
这次讨论有两点需要注意。首先,你应该提到你指的是.NET,尽管从拼写和后续讨论中已经很清楚了。 - orcmid
1
其次,对于此处的重新使用ToString很奇怪,所有对静态类的方法间依赖都是如此。考虑使用DumpLogToString()等方式。更好的做法是,考虑使用一个日志访问实例而不是静态类来处理这个问题,以面向对象的方式处理。 - orcmid
1
好的,通过阅读一些评论并在互联网上进行了一些研究,看起来我可能误用了这个静态类。这是我正在查看的参考资料:http://dotnet.dzone.com/news/c-singleton-pattern-vs-static- - Keith Sirmons
3个回答

16

是的,使用 "new" 修饰符将有效地消除编译器警告,但您正在显式隐藏一个实例方法,以静态方法代替。(这与覆盖该方法不同。)通常您不希望隐藏实例方法,除非有非常好的理由,并且您真的不应该使用静态方法来隐藏它,因为那会真正改变调用的行为语义。在.NET中,每个对象都有一个名为 ToString() 的实例方法,具有开发人员期望的特定行为;通过使用新的静态方法隐藏该行为,您正在更改该期望,这可能会导致很多困惑。

您要“转换成字符串”的内容是什么?静态类通常不包含内部状态,因此在 ToString() 调用的逻辑输出中实际上不应提供任何内部数据。您可能需要重新考虑类设计或提供不隐藏实例 ToString() 的更清晰的方法名称。


在映射逻辑条件的类中,我遇到了同样的问题:and、or、not等都被映射为true和false,这是静态实现的。为了输出复杂的条件树,我希望将and ToString()为“x and y”,同样地,我希望true ToString()为“true”。true是静态的——只能有一个。;)很高兴听到其他的替代方案! - Andreas Reiff

3
在静态类中,您无法重写ToString。 ToString是一个实例方法,根据定义,静态类只能有静态成员。
此外,为什么要覆盖ToString()?没有办法获取类的实例,因此也没有办法调用该函数。
注意:使用新语法不会覆盖ToString。它将创建一个与Object.ToString()方法完全无关的新成员。

严格来说,他并没有重写object.ToString,而是隐藏了它。至于为什么,我无法评论。 - Bill the Lizard
正确。他文章的标题中提到了“override”,所以我想澄清一下这究竟是与我的答案有何不同。 - JaredPar

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接