オブジェクト指向プログラミングでは、クラスのメソッドの実装コードを格納するために、クラス実装ファイルがよく使用されます。C++やObjective-Cなどのプログラミング言語では、これらのメソッドのインターフェースと実装を分離するために、これらの実装ファイルを使用します。[ 1 ]
この構造を使用すると、クラスとそのメンバーの宣言を含むクラス定義ファイルも作成されます。クラス定義がインクルードされ、そのメソッドの実装ファイルが利用可能であれば、ユーザーはクラスのオブジェクトをインスタンス化できます。この構造の目的は、実装コードを隠蔽しつつ、ユーザーが設計を確認できるようにすることです。[ 2 ] [ 3 ]
ユーザーはオブジェクトのパブリックインターフェースを利用して、オブジェクトの作成をできるだけ簡単にし、クライアントコードがクラスの実装の不要な詳細でユーザーの注意をそらさないようにします。[ 4 ] これにより、ユーザーはクラスを効果的に使用するために必要な情報を得ることができますが、コンパイルされたコードを破損することを防ぎます。[ 5 ]
C++プログラミングでは、クラス定義を作成する際に、インターフェースと実装を分離するために実装ファイルが使用されます。ヘッダーファイルには、クラスが持つすべてのメンバ関数(メソッド)とデータメソッド(フィールド)が宣言されます。 [ 6 ] [ 7 ] [ 8 ]
実装ファイルには、ヘッダーファイルで宣言されたメソッドの実際の定義またはソースコードが含まれます。このファイルは、定義されたクラスの目的や、ファイルの作成者や作成日など、実際のファイルの作成に関する詳細を説明するコメントを提供するヘッダーブロックで開始できます。[ 9 ]また、ファイル内で宣言されたメソッドで使用されるC++標準ライブラリ のライブラリを含めることもできます。クラスの実装ファイルには通常、関連するヘッダーファイルを含める行があります(以下の例を参照)。
例えば、 というクラスがあるとしますExampleClass。この C++ ファイルのヘッダーファイルは " Example.hpp " という名前で、実装ファイルは " ExampleClass.cpp " という名前になります。[ 10 ] [ 11 ]
この例では、関数の実装は省略されていますが、関数はExampleClass.hppで次のように宣言する必要があります。[ 12 ]
#include <string>namespace wikipedia :: examples {class ExampleClass { private : std :: string name ; public : ExampleClass (); // コンストラクタ。void addSomething ( int k ); };}ExampleClass.cppの構造例は次のようになります。
#pragma once#include "ExampleClass.hpp"namespace wikipedia :: examples {ExampleClass :: ExampleClass () = default ;void ExampleClass::addSomething ( int k ) { // ... }}この構造は、若干意味論が異なるものの、 C++モジュールでも再現可能です。
ExampleClass.cppm(宣言ファイル)内:
export module wikipedia . examples . ExampleClass ;import std ;std :: stringを使用します。export namespace wikipedia :: examples {class ExampleClass { private : string name ; public : ExampleClass (); // コンストラクタ。void addSomething ( int k ); };}ExampleClass.cpp(定義/実装ファイル)内:
module wikipedia . examples . ExampleClass ;namespace wikipedia :: examples {ExampleClass :: ExampleClass () = default ;void ExampleClass::addSomething ( int k ) { // ... }}これは、次のようにMain.cppファイルに含めることができます。
import wikipedia.examples.ExampleClass ;using wikipedia :: examples :: ExampleClass ;int main ( ) { ExampleClass myInst ; myInst.addSomething ( 5 ) ; return 0 ; }クラス実装ファイルの構造の別の例として、iOSプログラミングで使用されるObjective-Cが挙げられます。[ 13 ]この例では「ExampleClass」を使用します。これらの実装ファイルを使用する際の C++ とObjective-C の顕著な違いは、ファイルの末尾に使用される拡張子です。C++ では.cpp [ 14 ] 、 Objective-C では.m [ 15 ]となりますが、どちらもヘッダーファイルには 同じ.h拡張子を使用します[ 16 ] [ 17 ] 。これは以下の例で示しています。
これはObjective-CのExampleClass.hの例です。
#import <UIKit/UIKit.h>@interface ExampleClass : NSObject { // インスタンス変数の宣言はここに記述します} - ( NSString * ) name ; @endこれは、Objective-Cで記述されたクラスの実装ファイルExampleclass.mの例です。
#import "ExampleClass.h"@implementation ExampleClass - ( NSString * ) name { return @"…" ; } @end