2013-03-12 33 views
2

我擡頭System.Xml.XmlWriter類,我發現它是一個抽象類調用,你必須創建新的對象與創建方法,我想知道什麼是這背後的OOP推理和爲什麼不XmlWriter設計更像類來自System.IO什麼是XmlWriter設計背後的OOP推理?

+3

你可能想問微軟這個問題。 – 2013-03-12 17:22:38

+0

我不同意* close *投票。這個問題的答案很可能「由事實,參考或具體的專業知識支持」。 – 2013-03-14 09:43:53

回答

1

XmlWriter是可以編寫XML文檔的類的抽象基類。在docs中,您可以看到從XmlWriter派生了各種類,它們將Xml寫入各個目標。 XmlWriter本身只是爲Xml編寫者定義了公共接口和一些表面實現。

這與abstract TextWriter class類似。

靜態Create方法似乎存在,因爲對於某些情況(例如寫入文件),建議使用特定子類。該子類由相應的Create方法實例化。

注意XmlWriter.Create用於寫入文件並不一定創造一個XmlTextWriter。 .NET框架代碼可能會決定不同的(可能是內部的)類型更適合您的特定環境和設置。在您調用靜態方法Create時,您不必關心實際實例化的類型。要明白其中的道理

1

時要與所有派生類共享某些實施細則還不允許用戶只需istantiate並直接使用你的基礎抽象類使用抽象類。

的接口是一個純抽象類,這意味着所有方法和字段應該由實現該接口,所以沒有碼再使用除了比方法/屬性簽名在所有的類來實現。

System.IO類,最有可能你是在尋找類,如PathFileDirectory,我沒有看到太多抽象的存在,因爲所有文件都是一樣的,所有的目錄都一樣等,而XmlWriter是通用的,根據具體情況,派生的具體類將逐個實施所需的專業化。

+0

來自JaredPar和Justin的答案在這種情況下更具體到你的問題,我的答案是關於抽象類vs接口的更一般的,並沒有回答你的具體問題。仍然留下我的答案,有一次在那裏...... – 2013-03-12 17:44:55

1

一個辦法是看一組來自XmlWriter獲得虛擬方法和類型。幾乎所有的虛擬方法都是Write變種。就讓我們來看看在反射顯示了10派生類型包括那些

  • 寫輸出,在一個標準的文本方式
  • 待辦事項UTF8特定的編碼技巧
  • 寫輸出異步
  • 寫+幅面輸出

基於此,使其成爲抽象類的主要原因是允許開發人員定製輸出的輸出和方式

3

這是實踐中的factory method pattern,當您希望抽象出應該構建接口或基類的實現的決定時使用它。

在這種情況下,通過在使用XmlWriter.Create時檢查IL可以看出,該方法有許多可能的不同內部類型,例如, XmlUtf8RawTextWriterIndentHtmlUtf8RawTextWriter可供選擇 - 您需要首先使用Create方法來創建這些類,因爲這些類型是內部的(因此您不能直接調用它們的構造函數),也因爲它是包含作者應該圍繞的邏輯的Create方法在什麼情況下創建。