XmlWriter设计背后的OOP推理是什么?

时间:2013-03-12 17:21:24

标签: c# .net oop

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

4 个答案:

答案 0 :(得分:3)

这在实践中是factory method pattern,当您希望抽象出应该构造接口或基类的实现的决定时使用。

在这种情况下,通过在使用XmlWriter.Create时检查IL,我可以看到该方法有许多可能的不同内部类型,例如:您可以选择XmlUtf8RawTextWriterIndentHtmlUtf8RawTextWriter - 您需要首先使用Create方法创建这些类,因为这些类型是内部的(因此您不能直接调用它们的构造函数),也因为它是Create方法,其中包含应在何种情况下创建writer的逻辑。

答案 1 :(得分:1)

当你想与所有派生类共享某些实现细节但是不允许用户直接使用你的基本抽象类时,你使用抽象类。

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

对于System.IO课程,您很可能正在查看PathFileDirectory等课程,因为所有文件都是同样,所有目录都是相同的,而XmlWriter是通用的,根据具体情况,派生的具体类将逐个实现所需的特化。

答案 2 :(得分:1)

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

这类似于abstract TextWriter class

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

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

答案 3 :(得分:1)

理解原因的一种方法是查看从XmlWriter派生的一组虚拟方法和类型。几乎所有虚拟方法都属于Write种类。快速查看反射器可显示超过10种派生类型,包括

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

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