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

标签 c# oop class-design

我最近编写了一个类库,其中包含一些对某些类型的文件建模的对象。比如有一个摘要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 等:用户无需重新编译代码即可获得新添加类型的好处。事实上,他们甚至不会注意到您进行了任何更改:如果操作正确,他们的代码将“正常工作”于他们从不知道存在的类型的文档。

附言如果您可以扫描字节数组并从中找出正确的类型,您的 API 就可以通过消除第二个参数来“为风格赢得一些分数”。

关于c# - 谁应该负责选择合适的派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11297236/

相关文章:

java - 最佳实践 : instance variables filling over time

c# - 为什么不能将 null 转换为 C# 中的类型参数 T?

c# - 跨方法使用对象

javascript - OO Javascript 构造函数模式 : neo-classical vs prototypal

c++ - 将实现注入(inject)到 C++ 中的类中

php - 具有不同数量参数的子类构造函数

C# List<T> 隐藏属性?

c# - 从 Windows Phone 8.1 Silverlight 中的后台代理发送静默 toast

c# - 是否可以在 C# 中创建一个字符串并将其与 PowerShell 一起使用?

c++ - 避免过多的函数参数 : class-centered or function-centered approach?