2008-11-10 115 views
7

我有一个公共静态类,我想要一个ToString()方法。如何在静态类中覆盖ToString?

我已经把它定义为公共静态字符串的ToString(),但得到以下警告:

'Class.ToString()' 隐藏继承成员 'object.ToString()'。要使当前成员重写该实现,请添加override关键字。否则,添加新的关键字。

如果我添加override关键字我得到这个错误,而不是:

静态成员 'Class.ToString()' 不能被标记为覆盖,虚拟或抽象

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

谢谢
基思

+0

我可以问为什么你想这样做吗? (只是好奇) – StingyJack 2008-11-10 16:42:44

+0

我有一个ErrorLog是一个静态类,通过我的代码,我可以将ErrorLogItem添加到ErrorLog。 ErrorLog可以通过保存所有ErrorLogItems将自身保存到数据库。如果数据库不可访问(严重错误),我可以将整个日志转换为字符串并将其保存到磁盘。 – 2008-11-10 16:47:44

+0

这个讨论有两件事。首先,你应该提到你的意思是.NET,尽管从拼写和随后的讨论中可以看出。 – orcmid 2008-11-10 16:53:15

回答

12

是的,使用“新”修饰符将有效地消除编译器警告,但您是明确隐藏实例方法与静态方法。 (这与重写该方法不同)。通常,除非有非常好的理由,否则不希望隐藏实例方法,并且实际上不应该使用静态方法隐藏实例方法,因为这会真正改变调用的行为语义。 .NET中的每个对象都有一个名为ToString()的实例方法,它具有开发人员期望的特定行为;通过用一种新的静态方法隐藏该行为,您正在改变这种可能导致大量混淆的期望。

你“串线”是什么?静态类通常不保存内部状态,所以实际上不应该有任何内部数据作为ToString()调用的逻辑输出提供。您可能想要重新考虑您的类设计,或者提供一个不需要隐藏实例ToString()就能更清楚地指示方法用途的不同方法名称。

3

在无法重写的ToString静态类。 .ToString是一个实例方法,根据定义,静态类只能有静态成员。

另外你为什么要重写.ToString()?无法获得该类的实例,因此无法调用该函数。

注意:使用新的语法不会覆盖.ToString。它将创建一个与Object.ToString()方法完全无关的新成员。