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

时间:2012-07-02 16:05:26

标签: c# oop class-design

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

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

ExcelDocument

这是可接受的设计,客户端必须知道要使用的派生类吗?或者我最好隐藏除抽象var wordDocument = new WordDocument(wordDocumentByteArray); var pdfDocument = new PdfDocument(pdfDocumentByteArray); 类之外的所有类,并使用诸如抽象工厂模式之类的东西来返回正确的派生类型? e.g:

Document

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

2 个答案:

答案 0 :(得分:9)

第二种方法比第一种方法好得多,因为它隐藏了来自库用户的Word和Pdf文档存在的事实。当您决定添加更多文档类型时,这一点变得尤为重要 - 例如Rtf,Html等:用户可以获得新添加类型的好处,而无需重新编译代码。事实上,他们甚至不会注意到你已经改变了一切:如果做得对,他们的代码就会#34;只是工作"他们从未知道存在类型的文件。

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

答案 1 :(得分:3)

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