我查了System.Xml.XmlWriter
类,我注意到它是一个抽象的调用类,你必须使用Create方法创建新对象,我想知道这背后的OOP推理是什么,为什么不会{{ 1}}的设计更像XmlWriter
中的类。
答案 0 :(得分:3)
这在实践中是factory method pattern,当您希望抽象出应该构造接口或基类的实现的决定时使用。
在这种情况下,通过在使用XmlWriter.Create
时检查IL,我可以看到该方法有许多可能的不同内部类型,例如:您可以选择XmlUtf8RawTextWriterIndent
或HtmlUtf8RawTextWriter
- 您需要首先使用Create
方法创建这些类,因为这些类型是内部的(因此您不能直接调用它们的构造函数),也因为它是Create
方法,其中包含应在何种情况下创建writer的逻辑。
答案 1 :(得分:1)
接口是纯抽象类,这意味着所有方法和字段都应该由实现该接口的类实现,因此除了方法/属性签名之外,根本不会重复使用代码。
对于System.IO
课程,您很可能正在查看Path
,File
,Directory
等课程,因为所有文件都是同样,所有目录都是相同的,而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种派生类型,包括
基于此,使其成为抽象类的主要原因是允许开发人员自定义输出和编写输出的方式