ホームページ Java &#&チュートリアル Javaによるインターフェース指向プログラミングの具体例を詳しく解説

Javaによるインターフェース指向プログラミングの具体例を詳しく解説

Sep 20, 2017 am 10:24 AM
java プログラミング

この記事では、インターフェイスの性質、オブジェクト指向プログラミングとインターフェイス指向プログラミングの関係、および著者自身の理解の一部を組み合わせて、インターフェイス指向プログラミングについていくつかの事項を紹介します。それを必要とする友人は、インターフェイス指向プログラミングについて学ぶことができます。

オブジェクト指向プログラミング言語を使用するプログラマーにとって、「インターフェイス」という用語はよく知られていると思いますが、インターフェイスって何に使うの?抽象クラスとの違いは何ですか?インターフェイスの代わりに抽象クラスを使用できますか?また、プログラマであれば「インターフェース指向プログラミング」という言葉をよく聞くと思いますが、これはどういう意味なのでしょうか?イデオロギー的な意味合いとは何ですか?オブジェクト指向プログラミングとの関係は何ですか?この記事では、これらの質問に 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 クラスに基本的に共通のコードがなく、それらをインスタンス化する必要がある PersonH​​andle クラスがあり、それらが男性か女性かを知りたくない場合は、単に扱います彼らを人間として扱い、ポリモーフィズムを実現するには、それをインターフェースとして定義する必要があります。

つまり、インターフェイスと抽象クラスの違いは、それ自体ではなく、主に使用動機にあります。何かを抽象クラスとして定義する必要があるか、インターフェイスとして定義する必要があるかは、特定の環境のコンテキストによって異なります。

さらに、インターフェイスと抽象クラスのもう 1 つの違いは、抽象クラスとそのサブクラスの間には一般的かつ特別な関係が必要であるのに対し、インターフェイスはそのサブクラスが実装する必要がある一連のルールにすぎないことだと思います。 (もちろん、一般的な関係と特別な関係が存在する場合もありますが、インターフェイスを使用する目的はここではありません。) たとえば、乗り物を抽象クラスとして定義し、車、飛行機、船をサブクラスとして定義することは許容されます。 、飛行機、船は特別な交通手段です。もう 1 つの例は、Icomparable インターフェイスです。これは、このインターフェイスを実装するクラスが比較可能である必要があることを示しているだけです。 Car クラスが Icomparable を実装している場合、それは単に 2 つの Car インスタンスを比較するためのメソッドが Car にあることを意味します。それはより高価であったり、より大きくなったりするかもしれませんが、それは問題ではありません。しかし、「車は特別な種類である」とは言えません。これは文法的に不合理です。」

概要

一般に、インターフェイス指向プログラミングとは、オブジェクト指向システム内のクラスまたはモジュール間のすべての対話がインターフェイスによって完了されることを意味します。

以上がJavaによるインターフェース指向プログラミングの具体例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Oct 11, 2024 pm 08:58 PM

Python は、問題解決の初心者に力を与えます。ユーザーフレンドリーな構文、広範なライブラリ、変数、条件文、ループによる効率的なコード開発などの機能を備えています。データの管理からプログラム フローの制御、反復的なタスクの実行まで、Python が提供します

コーディングの鍵: 初心者のための Python の力を解き放つ コーディングの鍵: 初心者のための Python の力を解き放つ Oct 11, 2024 pm 12:17 PM

Python は、学習の容易さと強力な機能により、初心者にとって理想的なプログラミング入門言語です。その基本は次のとおりです。 変数: データ (数値、文字列、リストなど) を保存するために使用されます。データ型: 変数内のデータの型 (整数、浮動小数点など) を定義します。演算子: 数学的な演算と比較に使用されます。制御フロー: コード実行のフロー (条件文、ループ) を制御します。

C の謎を解く: 新人プログラマーのための明確でシンプルな道 C の謎を解く: 新人プログラマーのための明確でシンプルな道 Oct 11, 2024 pm 10:47 PM

C は、初心者がシステム プログラミングを学習するのに最適な選択肢です。ヘッダー ファイル、関数、メイン関数のコンポーネントが含まれています。 「HelloWorld」を印刷できる単純な C プログラムには、標準入出力関数宣言を含むヘッダー ファイルが必要で、main 関数で printf 関数を使用して印刷します。 C プログラムは、GCC コンパイラーを使用してコンパイルして実行できます。基本をマスターしたら、データ型、関数、配列、ファイル処理などのトピックに進み、熟練した C プログラマーになることができます。

内なるプログラマーを解き放つ: まったくの初心者のための C 内なるプログラマーを解き放つ: まったくの初心者のための C Oct 11, 2024 pm 03:50 PM

C は初心者がプログラミングを学ぶのに理想的な言語であり、効率性、汎用性、移植性などの利点があります。 C 言語の学習には次のことが必要です。 C コンパイラ (MinGW や Cygwin など) をインストールする 変数、データ型、条件文、ループ文を理解する main 関数と printf() 関数を含む最初のプログラムを作成する 実際のケースによる練習 (平均値の計算など) C言語の知識

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

未来を創る: まったくの初心者のための Java プログラミング 未来を創る: まったくの初心者のための Java プログラミング Oct 13, 2024 pm 01:32 PM

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

See all articles