クラスを調べたところSystem.Xml.XmlWriter
、それが抽象呼び出しクラスであり、Createメソッドを使用して新しいオブジェクトを作成する必要があることに気付きました。この背後にあるOOPの理由は何であり、なぜXmlWriter
からのクラスのように設計されないのか疑問に思いましたSystem.IO
。
4 に答える
これは実際のファクトリ メソッド パターンであり、インターフェイスまたは基本クラスのどの実装を構築する必要があるかの決定を抽象化する場合に使用されます。
この場合、メソッドを使用するときに IL を調べるとわかることからXmlWriter.Create
、たとえばXmlUtf8RawTextWriterIndent
、またはHtmlUtf8RawTextWriter
選択するために、Create
メソッドを使用してこれらのクラスを作成する必要があります。これらの型は内部であるためです (そしてしたがって、それらのコンストラクターを直接呼び出すことはできません) またCreate
、どのシナリオでどのライターを作成する必要があるかについてのロジックを含むメソッドであるためです。
特定の実装の詳細をすべての派生クラスと共有したいが、ユーザーが基本抽象クラスを単純にインスタンス化して直接使用することを許可しない場合は、抽象クラスを使用します。
インターフェイスは純粋な抽象クラスです。つまり、すべてのメソッドとフィールドは、そのインターフェイスを実装するクラスによって実装される必要があるため、メソッド/プロパティ シグネチャ以外のコードの再利用はまったくありません。
クラスについては、、 、System.IO
のようなクラスを見ている可能性が最も高いです。すべてのファイルが同じであり、すべてのディレクトリが同じであるなど、抽象化するものはあまりありませんが、XmlWriterは汎用であり、特定のケースに応じて具体的なクラスを派生させます。ケースバイケースで必要な専門分野を実装します。Path
File
Directory
XmlWriter
Xml ドキュメントを記述できるクラスの抽象基本クラスです。docsでは、XmlWriter
Xml をさまざまな宛先に書き込むさまざまなクラスが派生していることがわかります。XmlWriter
それ自体は、パブリック インターフェイスと Xml ライターの表面的な実装を定義するだけです。
これは抽象TextWriter
クラスに似ています。
Create
特定の状況 (ファイルへの書き込みなど) では、特定のサブクラスが推奨されるため、静的メソッドが存在するようです。そのサブクラスは、それぞれのCreate
メソッドによってインスタンス化されます。
ファイルへの書き込みでXmlWriter.Create
は、必ずしもXmlTextWriter
. .NET フレームワーク コードは、特定の環境と設定により異なる (おそらく内部) タイプがより適切であると判断する場合があります。静的Create
メソッドを呼び出すとき、どの型が実際にインスタンス化されるかを気にする必要はありません。
その理由を理解する 1 つの方法は、から派生した一連の仮想メソッドと型を調べることですXmlWriter
。ほとんどすべての仮想メソッドはWrite
さまざまです。リフレクターをざっと見てみると、10 を超える派生型が表示されます。
- 標準的なテキスト形式で出力を記述します
- Utf8 固有のエンコーディング トリックを行う
- 出力を非同期に書き込む
- 書き込み + 出力のフォーマット
これに基づいて、抽象クラスにする主な理由は、開発者が出力と出力の記述方法をカスタマイズできるようにすることです。