私は最近、特定の種類のファイルをモデル化するいくつかのオブジェクトを含むクラスライブラリを作成しました。例えば、抽象Document
クラスはなど、派生クラスPdfDocument
(コンクリート)とOfficeDocument
(例えばWordDocument
とExcelDocument
などの具体的な派生クラスで抽象的、)と、そこにある適切な派生クラスを選択する責任は誰にありますか?
現在のクライアントが新しいオブジェクトを作成する方法が選択することです適切な派生クラスを作成し、バイト配列を渡します。
var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);
この許容可能な設計は、クライアントが使用するクラスを派生何を知っていなければならないということです:私はPdfDocumentとWordDocumentのバイト配列を持っているのであれば、例えば私のような何かをしますか?または、抽象的なDocument
クラス以外のすべてを隠しておき、抽象的なファクトリパターンなどを使用して正しい派生型を返す方が良いでしょうか?例えば:
var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is
注意派生型が抽象クラスに追加のプロパティ/メソッドを追加しないことを、彼らはさまざまな方法で抽象メソッドを実装します。
2番目のオプションです。将来の拡張性がはるかに容易になり、より適切な新しい型が追加されたときに、クラス宣言の更新に要する時間が短縮されます。 –
'Document'クラスは、エンドユーザが与えられた' Document'を使って行う必要があるすべてのものを持っていますか、あるいはより派生した型に特有の機能へのアクセスを必要とする(あるいは頻繁に) – Servy
@Servyはい、 'Document'クラスは公開抽象メソッドを1つ持っています。派生クラスはすべて、1つのパブリックメソッドを実装する唯一の目的で、保護されたヘルパーメソッドとプライベートヘルパーメソッド(オーバーライドされたパブリックメソッド)で構成されます。 – Andrew