2009-09-07 52 views
14

C#3.5でインターフェイスを実装するメリットは何ですか?インターフェイスを実装するメリット

+9

おそらくC#3.0を意味します。 3.5は.NET Frameworkのバージョンです。 C#でのインタフェースの利点は、バージョン1.0以来同じです。それは読み込まれた質問です。あなたはGoogleまたはbingを使用して答えを見つけることができます。 – Vadim

+0

はい、3.0 試した検索では明確なメリットが得られませんでした。 – DotNetRookie

+3

+1、私はなぜこれがdownvoted表示されません。 –

答えて

25

インターフェイスを引数として使用するメソッドにオブジェクトを渡す(または型の制約を満たす)ことができます。 C#は "duck typing"をサポートしていません。ただ、インターフェイスによって定義されたメソッドを書き込むことによって、オブジェクトは自動的にインターフェイスタイプと「互換性」ではありません。

public void PrintCollection<T>(IEnumerable<T> collection) { 
    foreach (var x in collection) 
     Console.WriteLine(x); 
} 

List<T>IEnumerable<T>インタフェースを実装していない場合は、あなたのようにそれを渡すことができないだろうPrintCollectionメソッドへの引数(たとえそれがGetEnumeratorメソッドを持っていたとしても)。

基本的に、インタフェースは契約を宣言します。インターフェイスを実装すると、クラスが契約に結び付けられます(適切なメンバーを提供することによって)。したがって、その契約に依存するすべてのもの(オブジェクトによって提供されるインタフェースによって指定された機能に依存するメソッド)は、オブジェクトでも機能します。あなたがしようとすると、それが役立つ

+0

例を挙げることはできますか? – DotNetRookie

+1

実際には、C#はバージョン4以降の "duck typing"をサポートしています。 http://msdn.microsoft.com/en-us/library/dd264741.aspx しかし、このシナリオでは、インターフェイスを使用するのに最適なソリューションです。 – Tohid

10

  • ユニットテストスタブ/モック
  • は、依存性の注入

優しさ(!この証明されていないが)世界の飢餓を解決実装します

dan

+2

世界の飢えを解決するために+1! \ o/ – Bombe

1

あなたはクラスの継承に縛られていません - どのクラスにもインターフェイスを適用できます。どのクラスも複数のインタフェースを持つことができます。つまり、C#は複数のクラス継承をサポートしていません。つまり、インタフェースを通じて適切な抽象レイヤを提供しています。

16

主な利点は、コードの可読性、コードの保守性、コードの意味です。

  • コード可読性:インターフェイスは、意図についての宣言を構成します。あなたのクラスの能力を定義します。 ISortableを実装すると、あなたのクラスがIRenderableまたはIConvertibleの場合と同じようにソートできることがはっきりとわかります。
  • コードセマンティクス:インターフェイスを提供し、それらを実装することで、HTMLとCSSのような概念を積極的に分離しています。クラスとは、実生活のオブジェクトや概念の一般的な特性をモデリングすることによって、現実を表現するための「オブジェクトクラス」の具体的な実装です。インタフェースは、オブジェクトが何を行うことができるかという動作モデルを定義します。これらの概念を分離することで、コードのセマンティクスがより明確になります。そうすることによって、いくつかのメソッドは動物クラスのインスタンスを必要とするかもしれませんが、他のメソッドは "ウォーキング"をサポートしている限り、あなたがそれらに投げるオブジェクトを受け入れるかもしれません。
  • コードのメンテナンス性:インターフェイスは結合を減らすのに役立ち、そのため、基本的なコードが影響を受けることなく、同じコンセプトの実装を簡単に交換できます。インターフェイスを実装する新しいクラスを定義することで、IMessageの実装を簡単に変更できます。 CMessageからCMyNewMessageClassへのすべての参照を体系的に置き換えることと比較してください。
+1

+1のカップリングに言及してください! – TrueWill

2

インターフェイスはコントラクト(オブジェクトが行うことができるもの)を定義し、具体的なクラス(または構造体)は具体的な動作を定義します。例えば、のIListインターフェイス

が、それは具体的な目的は、のIListを実装する他のオブジェクトのように使用するために提供しなければならないメソッドを定義します。 IListを使用することができるところでは、IListを実装するオブジェクトも使用できます。これらのIListメソッドが呼び出されたときに、オブジェクトを具体的に実装する方法とオブジェクトの振る舞いが残されます。

1

アン・インターフェースは、参照型であり、それは唯一の抽象メンバーが含まれています。インタフェースのメンバには、イベント、メソッド、プロパティ、インデクサがあります。しかし、インターフェースにはメンバーの宣言だけが含まれています。実装を実現するクラスに実装する必要があります。インターフェイスには、定数、データフィールド、コンストラクタ、デストラクタ、静的メンバーを含めることはできません。インタフェース内のすべてのメンバー宣言は暗黙的に公開されています。

4

インターフェイスは実際の利点を提供しません。インタフェースで行うことができるものは、他の言語構造を使用して行うことができます。複数の継承は、インターフェイスを使用することから派生した唯一の真の利点として引用されていませんが、私はC#で複数の継承を非常に簡単かつ明確に行うことができます。インターフェイスを「壊す」ことなくコードを変更するのは、すべての言い訳の中で最も賢明ではありません。クラスやインターフェイスを抽象化するのと同様に、具体的なクラスにも同じことが適用されます。機能シグネチャが変更されない限り、インタフェースは壊れていません。それが宣言された場所は関係ありません。機能的なプロトタイプを別々のファイルに入れ、 "I"を前に付けて名前を付けるだけで何も買わない。インタフェースが早期に定義され、その後契約を維持するという想定はばかげている。インターフェイスメソッドとそのパラメータはすべて変更されています。何も決して前もって知られていないからです。だからこそ、MicroSofはずっと前にMicroSofの使用を止めました。彼らにはIUnKnown、IUnknown2などがありました。

2

あなたは巨大な、商用ソフトウェア家で作業している場合 - あなたは、インタフェースの司法の使用を検討する必要があります。さもなければ、あなたはそれらから離れているべきです。マルチスレッドの場合と同じです。 「Hello World」を書くために20スレッドを生成するもう1つのスクリプトキディアプリがあれば、私は変態を起こすだろう。マルチスレッドは、それを必要とするアプリケーション、通常はマルチプロセッシング環境で完全に予約する必要があります。それは良いよりも害を引き起こす時間の90%です。スレッドのハイジャック/トピック外のコメントを気にしないでください。私は気にしない。私はあなたのほとんどが生きているよりもずっとこれをやってきました。ランクには特権があります。

3

インタフェースの主な利点は、プロジェクトの設計に主に関連しています。

インターフェイスを使用する場合:

  1. インタフェースの消費者は、そのインターフェイスを実装する必要があります。
  2. ブリッジパターンの設計。
  3. ユーザーがインターフェイスのルールを守らなければならないように契約を作成する。
  4. インターフェイスクラス(Object)のみをメインクラスから取得できます。
  5. でもクラスがプライベートで、スタイルのよう
  6. 多重継承の種類からインタフェースオブジェクトを取得することができます。
  7. 実装する必要はありません。実装している場合は単純に行ってください。他の賢明な方法を実装することができればいいと言います。
  8. クリーナーコード。
  9. クラスによって変更が実装される実装は、インターフェイスを先に進めることができます。
  10. 各クラスに、インタフェースを使用する方が優れたメソッドの別個の実装がある場合。たとえば、コレクション内のIEnumerable

C#Architectによると、単純な言葉で契約です。消費者はそれに固執する必要があります。

0

私はそれをインターフェースを理解する方法は、これらの場合に最も有用です:プログラマの間の労働の

  1. クリーナー部門。リード・プログラマーはインターフェースを作成し、ジュニア・プログラマーはそのインプリメンテーションを書き込みます。それは私には完璧な意味があります。リードプログラマは、インタフェースではなく擬似コードを書くことができます。

  2. いくつかの具体的な状況では、同じクラスの2つ以上の異なる実装が必要な場合があります。例えば、それを使用するインタフェース動物とクラスtigerとlionです。ライオンとトラは共通のものを共有しているので、ここでもそれは意味をなさない。インターフェイスを使用する場合は、別のクラスに共通の関数を記述する必要があり、コードの重複が発生するため、抽象クラスが優れています。

  3. あなたはライブラリを作成し、ユーザーが変更可能にしたいと考えています。したがって、インターフェイスとそのクラス実装を記述します。 libのユーザーは、独自の実装クラスを作成する可能性があります。これは、同じ結果を達成する異なるテクノロジ/アルゴリズムを使用する可能性がありますが、たとえばもっと速い方法で行うこともできます。これは私たちが使用するlibsのインターフェイスを非常に多く満たすことにもなりますが、独自のインターフェイスを書く必要はほとんどありません。ライブラリは書いていないからです。

関連する問題