インターフェイスを Ctor に送信する必要がある場合の例を教えてください。クラスに特定の動作を強制的に使用させたいとしましょう。
4 に答える
インターフェイスを任意のメソッドに渡すのと同じ理由で、インターフェイスをコンストラクターに渡します。たとえば、コンストラクターがオブジェクトのリストを受け取る場合、List ではなく IList を受け入れることができます。これは、コンストラクターが実際のリストを要求するのではなく、リストのように見えて動作する任意のオプションを受け入れ、より一般的なものにすることを示しています。
あなたが本当に尋ねてやりたいことは、「特定のインターフェースを実装するオブジェクトをコンストラクターに持たせるのはなぜですか」だと思います。
この動作により、作成しようとしているオブジェクトにinject
異なるタイプのオブジェクトを含めることができます。たとえば、データが書き込まれる場所 (ファイル、ネットワーク、データベース) を簡単に変更できます。
この種の動作は、作成時 (またはそれ以降) にパラメーターとしてさまざまな「デコレーター」を渡すことによって、クラスのさまざまなインスタンスの動作を変更できるようにしたい場合に、伝統的にデコレーター パターンのコンテキストで見られます。例:
interface ISerializer
{
void Serialize(object obj);
}
class BinarySerializer : ISerializer
{
public void Serialize(object obj)
{
// serialize obj as binary stream
}
}
class XMLSerializer : ISerializer
{
public void Serialize(object obj)
{
// serialize obj as XML
}
}
// ...
class PersistanceManager
{
private ISerializer serializer;
public PersistanceManager(ISerializer serializer)
{
this.serializer = serializer;
}
public void Persist(object[] objects)
{
foreach(object obj in objects)
{
serializer.Serialize(obj);
}
}
}
これで、実行時にさまざまな動作を挿入できます。
PersistanceManager manager1 = new PersistanceManager(new BinarySerializer());
PersistanceManager manager2 = new PersistanceManager(new XMLSerializer());
依存関係をクラスから分離したい場合は、これを行うことができます。カスタム クラスに別のクラスがある場合にインスタンスを作成する代わりに、インターフェイスを介してカスタム クラスの外部からその依存関係を注入します。
この依存性注入は、自分で作成したカスタム コーヒーによって実行することも、依存性コンテナーを利用することもできます。.NET の世界でこれによく使われるのは、Unity、Ninject、または Autofac です。