web-dev-qa-db-ja.com

なぜInterfaceを使用するのですか?標準化専用ですか?

なぜInterfaceを使用するのですか?

標準化専用ですか?

78
Azhar

インターフェイスの目的

  • 疎結合ソフトウェアを作成する
  • サポート 契約による設計 (実装者はインターフェース全体を提供する必要があります)
  • プラグ可能なソフトウェアを許可する
  • さまざまなオブジェクトが簡単に対話できるようにする
  • クラスの実装の詳細を互いに非表示にします
  • ソフトウェアの再利用を促進する

アナロジー1:米国のスペースシャトルと同様に、ロシアのソユーズ宇宙船と中国の神舟5はすべて同じ宇宙ステーションにドッキングできます。インタフェース。 (これは単なる例です-実生活でそれが本当かどうかはわかりませんが、例のために不信を中断しましょう)

Analogy 2:さまざまなコンピューターモニターをホームコンピューターに接続できるように。壁サイズのテレビ、古いCRT(厚手の種類)、20インチのフラットスクリーン、または視覚障害者がタッチで「見る」ための点字機を、プラグインに接続できます。コンピュータはすべてインターフェイス標準に同意しているためです。

C#インターフェースの詳細-C#/ OOPインターフェースでは、同じようなことをしているが、見えない/仮想世界。

あなたは標準化だけでなく、柔軟性スケーラビリティ拡張性維持性reusabilitytestabilityおよびpower

(ソフトウェアインターフェイスを使用すればするほど、これらの「バズワード」が理解されるようになります。そして、現実世界のインターフェイスを常に考慮してください。

170
John K

インターフェイスは、実装されたものができることを記述するために使用されます。したがって、同じインターフェースをこのインターフェースのタイプとして実装するいくつかのオブジェクトを扱う可能性があります。

例えば:

public interface IMyInterface{
    public void DoFirst();
    public int DoSecond();
}


public class A : IMyInterface{
   //class has to implement DoFirst and DoSecond
   public void DoFirst(){
     Console.WriteLine("Blubb1");  
   }

   public int DoSecond(){
     Console.WriteLine("Blubb2");
     return 2;  
   }
}

public class B : IMyInterface{
   //class has to implement DoFirst and DoSecond
   public void DoFirst(){
     Console.WriteLine("Blibb1");  
   }

   public int DoSecond(){
     Console.WriteLine("Blibb2");  
     return 4;
   }
}

クラスはいくつかの方法でインターフェースを実装します。ただし、IMyInterfaceとして使用できます。例えば:

public static void DoMethodsInInterface(IMyInterface inter){
    inter.DoFirst();
    inter.DoSecond();
}


public static void main(){

   DoMethodsInInterface(new A());
   DoMethodsInInterface(new B());
   //Or use it in a List
   List<IMyInterface> interlist = new List<IMyInterface>();
   interlist.Add(new A());
   interlist.Add(new B());
   foreach(IMyInterface inter in interlist){
      inter.DoFirst();
   }

}

インターフェースが有用である理由がこれで少し明らかになることを願っています。

29
martin

インターフェース用です:)、もの同士をインターフェースできるようにするため、持っているときに便利です

  • 同じものの複数の実装
  • インターフェイスを複数の異なるクラスに適用する場合、これらのクラスが何かをしたり機能を実行したりする何らかの規則が必要なため
5
Omu

高レベルのビューは次のとおりです...

インターフェイスは、 情報隠蔽 の概念で大きな役割を果たします。

基本的に、クラスの実装の詳細を非表示にして、呼び出し元のクラスがその実装に依存しないようにします。したがって、インターフェイスを使用すると、呼び出し元のクラスを変更せずに実装を変更できます。これはすべて、コードの複雑さを制限し、長期的には保守しやすくにします。

初めてインターフェイスを理解し始めたとき、それらは「クラスの説明を提供する契約」として説明されました。それがあなたに役立つかどうかはわかりませんが、車のインターフェースを考えれば、それはdrivesbreaks、およびturnsと言うことができます。したがって、ポイントAからポイントBに移動する限り、これらの機能がどのように実装されているかを実際に知る必要はありません。

3
matt_dev

インターフェイスはやや厄介です。彼らは、同じ名前と実装されたインターフェースが同じ振る舞いを意味すると信じているだけで、契約による設計をサポートしています。これはAPIドキュメントのおかげでのみ機能し、人間がチェックする必要があります。これにより、インターフェースが弱すぎます。それを回避する方法の1つは、正式な仕様です。一方、インターフェースは強すぎ、厳しすぎます。再利用の妨げになることが多いインターフェイスを進化させることはできません。これはプロトコルによって解決されます-動的言語のメカニズムは、メッセージを送信し(メソッドを呼び出す)、そのメッセージがレシーバーによってサポートされていない場合、標準のコールバックが呼び出されます。制約のある具体的なプロトコルを作成する方が良いでしょう。

2

インターフェイスがC#/ Javaなどの言語で使用される主な理由は、これらの言語が複数の(クラス)継承をサポートしていないためです( 多重継承の正確な問題は何ですか? を参照)。

ただし、複数の(インターフェイス)実装は許可されており、クラスをさまざまな方法で使用できます。

2
Catalin DICU

考える リモーティング ...

ここにはクライアントとサーバーが関係しています。インターネットによって物理的に分離されているとしましょう。クライアントは、サーバー上で実際に実行されるメソッドを呼び出しています。クライアントの観点から見ると、クライアントは実行を実行するサーバー内のオブジェクトについて何も知りません。ただし、どのメソッドを呼び出すかは知っています。クライアントプログラムの構築中は、インターフェイス(またはコントラクト)にしか公開されないためです。サーバー上に実際に存在するオブジェクト全体にはさらされていません。 .netリモート処理でいくつかのデモアプリを実行してみてください。残りは理解できます。幸せなプログラミング。

1
deostroll

インターフェイスは、特定の動作の機能の宣言のみを含むプロトタイプモーダルを提供します。

また、この動作をクラスに実装する場合は、クラスにこのインターフェイスを実装する必要があり、クラスにはこの動作機能があります。または、複数の動作が可能です。

クラスは複数のインターフェイスを実装できるためです。

0
Manoj Gupta

インターフェイスを使用する主な理由は次のとおりです

  1. 拡張性
  2. 実装の非表示
  3. インターフェイスを介したオブジェクトへのアクセス
  4. ゆるい結合。

こちらをご覧ください インターフェイスについて知るためのリンク ダウンロード可能なコード例

0
Vikram

他の誰かが私のような人で、説明だけでなく、例と実践によって学ぶなら、ここにいくつかのコードがあります。

プロジェクトのダウンロードを含む、C#でのニューラルネットワークのこの実装を見つけました。これは、エレガントで便利な方法でインターフェイスを使用します。

http://www.c-sharpcorner.com/UploadFile/rmcochran/AI_OOP_NeuralNet06192006090112AM/AI_OOP_NeuralNet.aspx

0
Dave

インターフェースから開始することにより、 proxy を実装できるため、具体的な実装のメソッドを呼び出すときに遅延読み込みや検証を実行できます。

0
lmsasu

なぜインターフェイスを使用するのですか?

一部の言語は、vtablesを使用して多態的なメソッド呼び出しを実装し、ほとんどの型情報を破棄して、インターフェイスの定義を困難にしますnot

そのため、言語設計で必要とされるため、単にインターフェイスを使用する場合があります。

0
Alex Jasmin

インターフェイスは、データ型を実装ロジックから分離します。

0
Anand