2

我查了一下System.Xml.XmlWriter类,我注意到它是一个抽象调用类,你必须使用 Create 方法创建新对象,我想知道这背后的 OOP 推理是什么,为什么不XmlWriter设计得更像System.IO.

4

4 回答 4

3

这是实践中的工厂方法模式,当您希望抽象出应该构建接口或基类的实现的决定时使用。

In this case from what I can see by inspecting the IL when you use XmlWriter.Create the method has a number of possible different internal types, e.g. XmlUtf8RawTextWriterIndent or HtmlUtf8RawTextWriter to choose from - you need to use the Create method to create these classes firstly because these types are internal (and therefore you cannot invoke their constructors directly) and also because it is the Create method that contains the logic around which writer should be created in what scenario.

于 2013-03-12T17:29:42.677 回答
1

当您想与所有派生类共享某些实现细节但不允许用户简单地实例化并直接使用您的基本抽象类时,您可以使用抽象类。

接口是一个纯抽象类,这意味着所有方法和字段都应该由实现该接口的类实现,因此除了方法/属性签名之外,根本没有代码重用。

对于System.IO类,很可能您正在查看诸如 , , 之类的类,Path因为所有文件都相同,所有目录都相同等,所以我看不到太多抽象的内容,而XmlWriter是通用的,并且取决于特定情况,派生的具体类将逐案实施所需的专业化。FileDirectory

于 2013-03-12T17:27:07.437 回答
1

XmlWriter是可以编写 Xml 文档的类的抽象基类。在docs中,您可以看到各种类都派生自XmlWriter将 Xml 写入各种目的地。XmlWriter它本身只是为 XML 编写器定义了公共接口和一些表面的实现。

这类似于抽象TextWriter

静态Create方法似乎存在,因为对于某些情况(例如写入文件),建议使用特定的子类。该子类由相应的Create方法实例化。

请注意,XmlWriter.Create写入文件不一定会创建XmlTextWriter. .NET 框架代码可能会决定不同的(可能是内部的)类型更适合您的特定环境和设置。当您调用静态Create方法时,您不必关心实际实例化的类型。

于 2013-03-12T17:27:35.657 回答
1

理解原因的一种方法是查看从XmlWriter. 几乎所有的虚拟方法都是Write多种多样的。快速浏览一下反射器会显示超过 10 种派生类型,包括那些

  • 以标准文本方式编写输出
  • 做 Utf8 特定的编码技巧
  • 异步写入输出
  • 写入+格式化输出

基于此,使其成为抽象类的主要原因是允许开发人员自定义输出和编写输出的方式

于 2013-03-12T17:28:33.903 回答