【发布时间】:2012-07-02 16:05:26
【问题描述】:
我最近编写了一个类库,其中包含一些对某些类型的文件进行建模的对象。比如有一个抽象的Document类,有派生类PdfDocument(具体的)和OfficeDocument(抽象的,有具体的派生类如WordDocument和ExcelDocument)等
目前客户端创建新对象的方式是选择适当的派生类并将字节数组传递给它。例如,如果我有一个 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
请注意,派生类型不会向抽象类添加额外的属性/方法,它们只是以不同的方式实现抽象方法。
【问题讨论】:
-
绝对是第二个选项。允许更容易的未来可扩展性,并意味着当添加新的、更合适的类型时,人们花费更少的时间来更新类声明。
-
Document类是否具有最终用户对给定Document所做的一切,或者他们是否偶尔(或经常)需要访问特定于更衍生的功能输入? -
@Servy 是的,
Document类有一个公共抽象方法。所有派生类仅包含受保护的和私有的辅助方法(加上被覆盖的公共方法),其唯一目的是实现一个公共方法。
标签: c# oop class-design