2008-11-10 161 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()方法完全無關的新成員。