2009-10-20 115 views
1

我想重寫ASP.NET JavaScriptSerializer類的Serialize方法。沒什麼特別,我只是想對從.NET返回的序列化字符串做一些額外的後處理。擴展一個沒有實現接口的類

不幸的是,這個類的方法都沒有被聲明爲虛擬的,而且類本身並不是從接口或抽象類派生的(看起來像是一個奇怪的疏忽,因爲有多少核心.NET Framework類是爲擴展而設計的) 。

根據我對這個主題所做的一些閱讀,看起來我有幾個選項可供選擇。

  • 創建擴展方法。我不是這個選項的忠實粉絲,因爲它涉及創建一個新的方法(編譯器不允許兩次使用相同的名稱/簽名),類消費者需要注意。

  • 從JavaScriptSerializer派生一個具有完全相同簽名的新類。由於JavaScriptSerializer沒有虛擬方法,我會在每個方法/屬性聲明中使用「new」關鍵字來執行方法隱藏。我認爲這個選項被認爲是一個裝飾模式?

  • 創建一個名爲IJavaScriptSerializer的新接口,該接口與JavaScriptSerializer具有相同的簽名。將我的代碼中的所有引用移除到JavaScriptSerializer,並替換爲對新創建的接口的引用。

我很想聽聽其他方法和每種方法的優缺點。

感謝您花時間閱讀。

回答

3

你誤會Decorator Pattern,這是指繼承的類和包裝的另一個實例的對象那個班。 (這在流中很常見)。在你的情況下,它不適用。

我會建議您爲JavaScriptSerializer類製作您自己的替換(或包裝,無論您需要什麼),而不嘗試使用相同的API。如果你需要能夠交換實現,我會用核心方法創建一個接口或基類,並且有兩個具體的實現,一個包裝原始的,另一個添加你的後處理。

一般來說,設計類時,應該設計滿足您的需求,而不是複製.Net Framework的內置類。

+1

這是我的第400個答案! – SLaks 2009-10-20 02:24:48

+0

現在你有超過9000個答案! :) 10,555是確切的。感謝您的貢獻! – 2012-10-09 18:56:56

0

轉到http://json.org和d/l是具有源代碼的幾個類中的一個,用於JSON序列化。

然後,在您的項目中進行後期處理,編譯和使用。

理想的情況下,在這一點上我想創建一個擴展方法,所以我可以只是這樣做:

List<MyObject> s = fillObject(); 
return s.ToJSON(); 
相關問題