この記事では、インターフェイスの性質、オブジェクト指向プログラミングとインターフェイス指向プログラミングの関係、および著者自身の理解の一部を組み合わせて、インターフェイス指向プログラミングについていくつかの事項を紹介します。それを必要とする友人は、インターフェイス指向プログラミングについて学ぶことができます。
オブジェクト指向プログラミング言語を使用するプログラマーにとって、「インターフェイス」という用語はよく知られていると思いますが、インターフェイスって何に使うの?抽象クラスとの違いは何ですか?インターフェイスの代わりに抽象クラスを使用できますか?また、プログラマであれば「インターフェース指向プログラミング」という言葉をよく聞くと思いますが、これはどういう意味なのでしょうか?イデオロギー的な意味合いとは何ですか?オブジェクト指向プログラミングとの関係は何ですか?この記事では、これらの質問に 1 つずつ答えます。
1. インターフェース指向プログラミングとオブジェクト指向プログラミングの関係は何ですか?
まず第一に、インターフェース指向プログラミングとオブジェクト指向プログラミングは同じレベルにありません。オブジェクト指向プログラミングよりも高度なプログラミングですが、オブジェクト指向のイデオロギー システムに付属しており、その一部です。つまり、オブジェクト指向プログラミングにおける考え方の本質の一つです。
2. インターフェースの本質
インターフェースは、表面上の本体コードを持たない複数のメソッド定義のコレクションであり、クラスまたは他のインターフェースによって実装できます。継承)。形式的には次のようになります:
interface InterfaceName { void Method1(); void Method2(int para1); void Method3(string para2,string para3); }
それでは、インターフェイスの本質は何でしょうか?つまり、インターフェースの存在意義とは何なのか。それは次の 2 つの観点から考えることができると思います:
1) インターフェースはルールの集合であり、このインターフェースを実装するクラスまたはインターフェースが持たなければならない一連の規則を規定します。 「あなたが...であるなら、あなたは...できるはずです」という自然の哲学を反映しています。
例えば、自然界では誰もが食べることができます、つまり、「人間であれば、食べることができなければなりません」。次に、コンピュータ プログラムにシミュレートされるときは、Iperson (通常、インターフェイス名は「I」で始まります) インターフェイスと Eat() というメソッドが必要です。次に、「person」を表すすべてのクラスが IPersonal インターフェイスを実装する必要があると規定します。 「人間である以上、食べなければいけない」という自然の法則をシミュレートしています。
ここからは、オブジェクト指向の考え方についてもわかると思います。オブジェクト指向の考え方の中核の 1 つは、現実世界をシミュレートし、現実世界の物事をクラスに抽象化し、プログラム全体が各クラスのインスタンスに依存して相互に通信し、相互に連携してシステム機能を完成させることです。現実世界の動作条件と非常に一致しており、オブジェクト思考の本質を指向しています。
2) インターフェースは、特定の詳細なビュー上で類似のものを抽象的に表現したものです。 「類似のもの」の概念は相対的なものであり、粒度の異なるビューによって異なるため、ここでは特定の粒度のビューを強調していることに注意してください。
例えば、私の目から見ると、私は豚とは根本的に異なる人間であり、クラスメートと私が同じ種類であることは受け入れることができますが、私と豚が同じ種類であることは決して受け入れられません。しかし、動物学者の目から見て、ブタと私は同じ種類であるはずです。なぜなら、私たちはどちらも動物だからです。動物学者は、「人」と「ブタ」の両方が IAnimal インターフェイスを実装していると考えることができ、動物の行動を研究するとき、彼はそうではありません。彼は私と豚を別々に扱い、「動物」というより大きな粒度からそれを研究しますが、私と木の間には本質的な違いがあると考えるでしょう。
今、私には遺伝学者がいますが、状況は異なります。すべての生き物は遺伝する可能性があるため、彼の目には私は豚と何ら変わらないだけでなく、蚊、細菌、木、動物と何ら変わらないのです。キノコとブタでさえ、SARS ウイルスには違いはありません。なぜなら、ウイルスは、私たち全員が IDescendable インターフェイス (注: 子孫 vi. 継承) を実装している、つまり、すべてが遺伝するものであると考えるからです。研究を行う際、彼の目には人間とウイルスの区別はなく、遺伝する物質と遺伝しない物質だけが存在します。しかし、少なくとも私と石の間には違いがあります。
しかし、ある日、不幸なことが起こりました。彼の名前はレーニンでした。彼はマルクスとエンゲルスの弁証法的唯物論の傑作を読んだ後、有名な決断を下しました。 :いわゆる実体とは、意識によって反映される客観的な現実です。この時点では、私と、石、空気の息、慣用句、そして携帯電話の信号を送信する電磁場との間に違いはありません。なぜなら、レーニンの目には、私たちは皆、意識によって反映される客観的な現実だからです。レーニンがプログラマーだったら、こう言うでしょう。いわゆる物質とは、「IReflectabe」インターフェースと「IEsse」インターフェースの両方を実装するすべてのクラスによって生成されるインスタンスです。 (注: 反映する vs. 反映する esse n. 客観的な現実)
おそらく、上記の例はナンセンスだと思われるかもしれませんが、これがまさにインターフェイスが存在する理由です。オブジェクト指向の思考の中核となる概念の 1 つはポリモーフィズムと呼ばれます。ポリモーフィズムとは何ですか?端的に言えば、ある粒度のビューレベルで似たものを分け隔てなく一律に扱うことを意味します。あえてこんなことをする理由はインターフェースの存在です。遺伝学者と同様に、彼はすべての生物が IDescendable インターフェイスを実装していることを理解しているため、生物である限り Descend() メソッドが必要です。これにより、各生物を個別に研究して最終的に疲れ果ててしまうのではなく、統合された研究を行うことができます。
おそらく、ここではインターフェイスの性質と機能について直感的な印象を与えることはできません。次に、次の例といくつかのデザイン パターンの分析で、インターフェイスの意味をより直観的に体験することができます。
3. インターフェース指向プログラミングの概要
以上のことから、インターフェースとインターフェースの思想的意味合いについては理解できたと思います。私の個人的な定義は、システム分析とアーキテクチャにおいて、レベルと依存関係を区別することです。各レベルは、一連のインターフェイスを定義することによってのみ、その上位層にサービスを直接提供するのではなく(つまり、上位層で直接インスタンス化されません)、上位層はそのインターフェイス機能を公開し、上位層は下位層のインターフェイスにのみ依存し、特定のクラスには依存しません。
これを行うことの利点は明らかです。まず、システムの柔軟性が向上します。下位層を変更する必要がある場合、インターフェースとインターフェース機能が変更されていない限り、上位層は変更を加える必要がありません。 WD 60G ハードドライブを Seagate 160G ハードドライブに交換するのと同じように、上位層のコードを変更せずに下位層全体を置き換えることもできます。代わりに、コンピュータの他の部分に変更を加える必要はありません。コンピュータの他の部分は特定のハード ディスクに依存せず、ハード ディスクがこのインターフェイスを実装している限り、IDE インターフェイスのみに依存するため、新しいハード ドライブを接続するだけです。交換できます。ここからは、プログラム内のインターフェースと現実のインターフェースがよく似ているので、インターフェースという言葉は本当に似ているなといつも思います!
インターフェイスを使用するもう 1 つの利点は、インターフェイスが一貫している限り、ハード ドライブを構築する開発者が CPU やモニターを構築するのを待つ必要がないのと同じように、さまざまなコンポーネントまたはレベルの開発者が並行して作業を開始できることです。設計が合理的であるため、開発を並行して完了でき、効率が向上します。
まずはこの記事はここで終わります。最後にもう一つ言っておきたいのですが、オブジェクト指向の本質は現実をシミュレートすることであり、それが私の記事の魂とも言えます。したがって、現実からオブジェクト指向をもっと考えることは、システムの分析能力や設計能力を向上させるのに非常に有益です。
次の記事では、例を使用してインターフェイス プログラミングの基本的な方法を説明します。
3 番目の記事では、古典的なデザイン パターンにおけるインターフェイス指向のプログラミングのアイデアをいくつか分析し、.NET 階層化アーキテクチャにおけるインターフェイス指向のアイデアを分析します。
1.「インターフェース指向プログラミング」の「インターフェース」と特定のオブジェクト指向言語の「インターフェース」という2つの単語について
私は友人が「インターフェース」の「インターフェース」という言葉を提唱しているのを見ました。 「指向プログラミング」は、純粋なプログラミング言語のインターフェイス範囲よりも広い必要があります。考えてみると、それは当然だと思います。ここに書いたことは確かに無理があります。オブジェクト指向言語における「インターフェース」とは、C#のinterfaceキーワードで定義されるインターフェースなど、特定のコード構造を指すと思います。 「インターフェイス指向プログラミング」の「インターフェイス」は、ソフトウェア アーキテクチャの観点およびより抽象的なレベルから、特定の基礎となるクラスを隠し、ポリモーフィズムを実装するために使用される構造コンポーネントを指すと言えます。この意味で、抽象クラスが定義され、ポリモーフィズムを実現することが目的であれば、この抽象クラスを「インターフェイス」と呼ぶのが妥当だと思います。しかし、ポリモーフィズムを実装するために抽象クラスを使用するのは合理的でしょうか?以下の 2 番目の記事で説明します。
要約すると、「インターフェイス」という 2 つの概念は互いに異なり、互いに関連していると思います。 「インターフェイス指向プログラミング」のインターフェイスは、ポリモーフィズムを実現し、ソフトウェアの柔軟性と保守性を向上させるために使用されるイデオロギー レベルのアーキテクチャ コンポーネントですが、特定の言語の「インターフェイス」は、このイデオロギー レベルでコードに実装される具体的なコンポーネントです。 。
2. 抽象クラスとインターフェイスについて
これは返信でよく議論されている問題であることが分かりました。この記事でこれについて議論することを深く考えずに申し訳ありませんでした。この問題についての私の個人的な理解は次のとおりです:
特定のコードだけを見ると、これら 2 つの概念があいまいになりやすく、多重継承を除いて特定の関数だけを見ると、インターフェイスが冗長であるとさえ考えられます。 (C#、Java )、抽象クラスはインターフェイスを完全に置き換えることができるようです。しかし、多重継承を実装するためのインターフェースは存在するのでしょうか?もちろん違います。私の意見では、抽象クラスとインターフェイスの違いは、それらを使用する動機にあります。抽象クラスを使用する目的はコードの再利用ですが、インターフェイスを使用する目的はポリモーフィズムを実現することです。したがって、インターフェイスを使用するか抽象クラスを使用するか迷っている場合は、その動機を考えてください。
IPersonal インターフェイスに疑問を抱いている友人を何人か見かけましたが、私の個人的な理解は、Iperson インターフェイスを定義する必要があるかどうかは特定のアプリケーションに依存するということです。プロジェクトに Women と Man があり、どちらも person を継承し、Women と Man のほとんどのメソッドは同じですが、メソッド
DoSomethingInWC() が 1 つだけ異なります (この例はかなり下品です、ご容赦ください)。もちろん、AbstractPerson 抽象クラスを定義します。他のすべてのメソッドを含めることができ、サブクラスは DoSomethingInWC() のみを定義するため、より合理的です。これにより、繰り返されるコードの量が大幅に削減されます。
ただし、プログラム内の Women クラスと Man クラスに基本的に共通のコードがなく、それらをインスタンス化する必要がある PersonHandle クラスがあり、それらが男性か女性かを知りたくない場合は、単に扱います彼らを人間として扱い、ポリモーフィズムを実現するには、それをインターフェースとして定義する必要があります。
つまり、インターフェイスと抽象クラスの違いは、それ自体ではなく、主に使用動機にあります。何かを抽象クラスとして定義する必要があるか、インターフェイスとして定義する必要があるかは、特定の環境のコンテキストによって異なります。
さらに、インターフェイスと抽象クラスのもう 1 つの違いは、抽象クラスとそのサブクラスの間には一般的かつ特別な関係が必要であるのに対し、インターフェイスはそのサブクラスが実装する必要がある一連のルールにすぎないことだと思います。 (もちろん、一般的な関係と特別な関係が存在する場合もありますが、インターフェイスを使用する目的はここではありません。) たとえば、乗り物を抽象クラスとして定義し、車、飛行機、船をサブクラスとして定義することは許容されます。 、飛行機、船は特別な交通手段です。もう 1 つの例は、Icomparable インターフェイスです。これは、このインターフェイスを実装するクラスが比較可能である必要があることを示しているだけです。 Car クラスが Icomparable を実装している場合、それは単に 2 つの Car インスタンスを比較するためのメソッドが Car にあることを意味します。それはより高価であったり、より大きくなったりするかもしれませんが、それは問題ではありません。しかし、「車は特別な種類である」とは言えません。これは文法的に不合理です。」
概要
一般に、インターフェイス指向プログラミングとは、オブジェクト指向システム内のクラスまたはモジュール間のすべての対話がインターフェイスによって完了されることを意味します。
以上がJavaによるインターフェース指向プログラミングの具体例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。