インタフェースは何かがどのように動作するかを述べています。それを契約書やテンプレートと考えてください。これはInverson of ControlやDependancy Injectionのようなものにとって重要です。
私はIoCコンテナとして構造マップを使用します。これにより、すべてのクラスのインターフェースを定義することができます。あなたは
Widget w = new Widget();
を言うかもしれないどこで
IWidget w = ObjectFactory.GetInstance<IWidget>();
これは私のコードは、必ずしもウィジェットは本当に何であるかを言っていないという点で非常に強力であると言うでしょう。これは、ウィジェットがIWidgetのインターフェースに基づいて行うことができることを知っているだけです。
これはIoCコンテナを使用しているので、これでいくつかの素晴らしい機能が実現できるようになりました。ウィジェットを使用する必要がある私の単体テストでは、ウィジェット用のモックを作成できます。つまり、私のウィジェットは、データベースやWebサービスに接続することで非常に強力なことをします。私のモックは、これらのリソースへの接続をシミュレートし、スタブされたデータを返します。これにより、私のテストはより速く実行され、より信頼できる方法で動作します。私はStructureMapを使用しているので、私のコードの実際の使用中に私のウィジェットの実際の実装をロードし、プログラム中または設定によってテスト中にWidgetの模擬バージョンをロードするようにStructureMapに指示することができます。
また、私はIoCコンテナを使用しているので、データをキャッシュする3つの異なる方法を書き込むなど、アプリケーションにクールな新機能を提供できます。 Lucene.NETなどのツールを使用して、ローカルキャッシュ用にローカルの開発者ボックスキャッシュを使用できます。開発サーバーに.NETキャッシュを使用させることができます。このキャッシュは、1つのボックスで大きく動作します。そして、私の生産サーバがMemCache Win32やVelocityのようなキャッシュ層を使うという3番目の選択肢があります。 3つのキャッシング実装がすべて同じインターフェイスに準拠している限り、実際の実装は私(または自分のコード)にはまったく関係しません。私は単にStructureMapに現在の環境の実装を取得してから作業するように頼んでいます。
Dependency Injectionに従っているなら、インターフェイスはクラスクラスのコンストラクタのインターフェイスとしてクラスの使用法を宣言できるという点で、StructureMapなどのIoCコンテナでも便利です。その後、
public class Widget(IWidgetRepository repository, IWidgetService service) : IWidget
{
//do something here using my repository and service
}
そして私は、そのような私はコンストラクタでリポジトリまたはサービスを指定していないです。この
IWidget widget = ObjectFactory.GetInstance<IWidget>();
お知らせなどのStructureMapの方法によってウィジェットのインスタンスを新しいです。 StructureMapは、コンストラクタで指定されたインタフェースを使用して、適切なインスタンスを取得して渡す方法を知っています。これは非常に強力でクリーンなコードです!
すべてのインターフェイスの簡単な定義とそれらのいくつかの賢い使い方から!
ここをクリックhttp://stackoverflow.com/questions/56867/interface-vs-base-classここにhttp://stackoverflow.com/questions/444245/how-will-i-know-when-to- create-an-interfaceとmore for "c#interface"を検索します。 – Marc