繁体   English   中英

谁应该负责选择合适的派生类?

[英]Who should be responsible for selecting the appropriate derived class?

我最近编写了一个类库,其中包含一些对某些类型文件进行建模的对象。 例如,有一个抽象的Document类,派生类PdfDocument (具体)和OfficeDocument (抽象,带有具体的派生类,如WordDocumentExcelDocument )等。

目前,客户端创建新对象的方式是选择适当的派生类并将其传递给字节数组。 所以例如,如果我有一个PdfDocument和WordDocument的字节数组,我会做类似的事情:

var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);

这是可接受的设计,客户端必须知道要使用的派生类吗? 或者我最好隐藏除抽象Document类之外的所有类,并使用诸如抽象工厂模式之类的东西来返回正确的派生类型? 例如:

var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is

请注意,派生类型不会向抽象类添加其他属性/方法,它们只是以不同方式实现抽象方法。

第二种方法比第一种方法好得多,因为它隐藏了来自库用户的Word和Pdf文档存在的事实。 当您决定添加更多文档类型(例如Rtf,Html等)时,这一点变得尤为重要:用户可以获得新添加类型的好处,而无需重新编译代码。 实际上,他们甚至都没有注意到你已经改变了任何东西:如果做得对,他们的代码将“正常”处理他们从未知道的类型的文档。

PS如果您可以扫描字节数组并从中找出正确的类型,那么您的API可以通过消除第二个参数来“获得一些样式点”。

如果派生类型没有添加任何属性/方法,并且您具有确定给定byte []使用什么类型的技术能力,我甚至不会将派生类公开...它们只是增加了表面区域消费者在学习图书馆时必须解析的东西。 只需要一个静态工厂方法,如public static Document OpenDocument(byte[] data)类中的public static Document OpenDocument(byte[] data)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM