インターフェイスを使用する理由
標準化のためだけですか?
類推 1 : 米国のスペースシャトルと同じように、ロシアのソユーズ宇宙船と中国の神舟 5 号は、同じドッキング インターフェイスを実装しているため、すべて国際宇宙ステーションにドッキングできます。(これは単なる例です。実際にそうであるかどうかはわかりませんが、例のために不信感を一時停止しましょう)
類推 2 : 自宅のコンピューターにさまざまなコンピューター モニターを接続できるように。壁サイズのテレビ、古いブラウン管 (厚いタイプ)、20 インチのフラット スクリーン、または視覚障害者が触って「見る」ための点字マシンを差し込むことができます。これらのさまざまな/異なるデバイスとあなたのなぜなら、それらはすべてインターフェース規格に同意しているからです。
C# インターフェースの詳細-- C#/OOP インターフェースを使用すると、同じ種類のことを行うことができますが、目に見えない/仮想世界で行われます。
あなたは標準化について正しいだけでなく、柔軟性、スケーラビリティ、拡張性、保守性、再利用性、テスト容易性、およびパワーについても正しいです。
(ソフトウェア インターフェイスを使用すればするほど、これらの「バズワード」が理解されるようになります。また、現実世界のインターフェイスについても常に考慮してください。なぜなら、それらは私たちを同じようにうまくやっているからです。)
インターフェイスは、実装されたものができることを記述するために使用されます。したがって、同じインターフェースをこのインターフェースのタイプとして実装する複数のオブジェクトを扱う可能性があります。
例えば:
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();
}
}
これにより、インターフェイスが役立つ理由が少し明確になることを願っています。
それはインターフェースのためのものです:)、あなたがものの間でインターフェースできるように、それはあなたが持っているときに便利です
これが高レベルのビューです...
インターフェイスは、情報隠蔽の概念において大きな役割を果たします。
これらは基本的に、クラスの実装の詳細を非表示にして、呼び出し元のクラスがその実装に依存しないようにするのに役立ちます。したがって、インターフェイスを使用すると、呼び出し元のクラスを変更せずに実装を変更できます。これにより、コードの複雑さが制限され、長期的には保守が容易になります。
私が最初にインターフェイスを理解し始めたとき、それらは「クラスの説明を提供するコントラクト」として説明されました。参考になるかどうかはわかりませんが、車のインターフェースについて考えてみると、それは「走る」「壊れる」「曲がる」と言えます。したがって、ポイント A からポイント B に移動できる限り、これらの機能がどのように実装されているかを知る必要はありません。
インターフェースはやや扱いにくいです。彼らは、同じ名前と実装されたインターフェースが同じ振る舞いを意味すると信じるだけで、契約による設計をサポートします。これはAPIドキュメントのおかげでのみ機能し、人間によるチェックが必要です。そのため、インターフェイスが弱くなりすぎます。それを回避する1つの方法は、正式な仕様である可能性があります。一方、インターフェースは強すぎ、厳しすぎます。再利用の邪魔になることが多いインターフェースを進化させることはできません。これはプロトコルによって解決されます-動的言語のメカニズムはメッセージを送信し(メソッドを呼び出す)、そのメッセージが受信者によってサポートされていない場合、標準のコールバックが呼び出されます。制約のある具体的なプロトコルを使用する方がよいでしょう。
リモーティングを考えてみてください...
ここにはクライアントとサーバーが関係しています。それらがインターネットによって物理的に分離されているとしましょう。クライアントは、サーバー上で実際に実行されるメソッドを呼び出しています。クライアントから見ると、クライアントは実行を実行するサーバー内のオブジェクトについて何も知りません。ただし、どのメソッドを呼び出すかはわかっています。クライアント プログラムの構築中は、インターフェイス (またはコントラクト) のみに公開されるためです。サーバー上に実際に存在するオブジェクト全体に公開されるわけではありません。.net リモート処理でいくつかのデモ アプリを実行してみてください。残りは理解できます。楽しいプログラミング。
インターフェイスから開始することで、プロキシを実装できるため、具体的な実装のメソッドを呼び出すときに、遅延読み込みやいくつかの検証を実行できます。
インターフェイスを使用する理由
一部の言語は、vtables を使用してポリモーフィック メソッド呼び出しを実装し、ほとんどの型情報を破棄して、インターフェイスを定義しないことを難しくしています。
そのため、言語設計で必要なため、単純にインターフェースを使用することがあります。
インターフェイスは、特定の動作の機能の宣言のみを含むプロトタイプ モーダルを提供します。
この動作をクラスに実装したい場合は、このインターフェイスをクラスに実装する必要があり、クラスにこの動作機能を持たせるか、複数の動作を持たせることができます。
クラスは複数のインターフェースを実装できるためです。
インターフェイスは、データ型を実装ロジックから分離します。