web-dev-qa-db-ja.com

ヘッダーファイルとインターフェイスの違い

Cとc ++のヘッダーファイルがJavaで使用されるインターフェイスと同じ機能を持っているかどうかを知りたいですか?そうでない場合、ヘッダーファイルとインターフェイスの違いは何ですか?

1
user304524

結構です。ヘッダーファイル内の定義は、Javaクラスのpublicメンバーにより密接に対応しています。ヘッダーファイルとパブリック/プライベートアクセス修飾子の両方により、パブリックに表示されるインターフェイスを区別できますコードの/ APIとその内部実装の詳細。

CまたはC++の宣言には、1つの定義ルールが適用されます。コンパイルされたプログラムには、宣言された関数またはグローバル変数ごとに1つの実装しか含めることができません(すべての定義が同等であるinlineとして宣言されている場合を除く)。したがって、ヘッダー内の1つの関数宣言について、1つの関数定義を.cまたは.cppファイルに記述します。別の定義を使用したい場合は、コードを再コンパイルする必要があります。

Java interfaces(または純粋な仮想メソッドを持つC++クラス)も一種の「インターフェース」を宣言しますが、非常に異なります。1つのclassは多くのinterfacesを実装でき、 interfaceは、多くのclassesによって実装できます。後者の点は非常に重要です。interfaceを介してオブジェクトのメソッドのみを呼び出すコードを記述できます。後で、このinterfaceに準拠するオブジェクトをそのコードに提供できますが、コードは引き続き機能します。コードを再コンパイルすることなく、実行時に複数の実装を選択できます。これにより、柔軟性が大幅に向上します。依存性注入。

基本的に、ヘッダーとinterfacesの動作は大きく異なります。ヘッダーには、後で解決されるがコンパイル中にまだ解決される前方宣言が含まれています。 interface(または非finalclass)は、実行時に動的ディスパッチによって解決される仮想メソッドを定義します。

また、異なる概念を意味します。ヘッダーやクラスのパブリック/プライベートアクセス修飾子などのメカニズムにより、抽象データ型(ADT)を実装できます。 ADTは一部のデータ構造の実装の詳細をカプセル化し、外部コードがパブリック関数またはメソッドを介してそれらの構造にアクセスすることのみを許可します。対照的に、interfacesと仮想メソッドはobjectsを実装できます。 1つのinterfaceは、多くの異なるオブジェクトによって実装できます。 1つの共通のinterfaceのオブジェクトが異なる動作をするこの機能は、polymorphismとも呼ばれます。

ADTとオブジェクトはどちらも「カプセル化」と関係がありますが、それらはまったく異なります。それらは補足概念として理解されるべきです。

ただし、オブジェクト指向ソリューションには大きな関心が寄せられています。例えば。 Design Patternsの本では、動的ディスパッチなどのオブジェクト指向の手法を適用することで、いくつかの興味深い問題を解決するのに十分な柔軟性をソフトウェアシステムに導入する方法を調査しています。ランダムな例として、複合パターンを使用すると、アイテムのコレクションを単一のアイテムと同等に扱うことができます。どうやって?コレクションと単一のアイテムの両方が同じinterfaceを実装します。これは、ヘッダーファイルだけでは不可能です。

4
amon