Java のインターフェースは、特定の言語構造またはキーワードです。interface
Java には、Java クラスが実際の実装を提供するのではなく、派生クラスが実装する必要があるインターフェイスを記述することを示すために使用されるキーワードがあります。これは Java コンパイラによってチェックされ、インターフェイスを実装すると主張するクラスがインターフェイスに必要なすべてのメソッドを提供することが保証されます。
Java では、interface
キーワードは、指定されたインターフェイス クラスによって記述された一連のサービスをクラスが提供することを示します。Java クラスは、複数の異なるインターフェースを実装する場合があります。
C++ の議論でインターフェイスという言葉が使用される方法は、クラス、関数、またはメソッドのパラメーターの型に関係しているため、やや似た概念です。ただしinterface
、C++ にはキーワードがありません。インターフェイスという言葉は、「関数インターフェイスは 2 つのショートと 1 つのロングで構成されます」のように、C++ ではより一般的で説明的な方法で使用されます。これは、関数呼び出し引数とその型、関数の呼び出し元と関数本体の間のインターフェイスを示しています。
したがって、C++ のインターフェイスは、インターフェイスを実装するクラスと、クラスからインスタンス化されたオブジェクトを使用するオブジェクトとの間の一種の契約と考えてください。クラスは実際には、それぞれが特定のインターフェースを持ついくつかの異なる関連サービスを提供することもできます。
interface
クラス記述で純粋仮想メソッドを使用して抽象クラスを作成することにより、C++ での Java の概念に似たことができます。これにより、実装のない C++ クラスが作成されます。C++: 抽象メソッドを使用して抽象クラスを作成し、サブクラスでメソッドをオーバーライドする を参照してください。
仮想メソッドが行うことは、実装の詳細を派生クラスに任せながら、クラスの派生クラスを使用するオブジェクトが特定のインターフェイスに依存できるようにするメカニズムを提供することです。したがって、これは Java インターフェースに似ています。C++ 仮想メソッドは、ランタイム アプローチではなく、コンパイルされた静的チェック アプローチを使用して Java インターフェイスを実装する方法を提供する方法です。
仮想メソッドを使用して、派生型から変数を割り当てることができるポインター変数を作成するために使用できるスーパークラス型を作成します。仮想メソッドを使用すると、派生クラスから正しいメソッドが呼び出されます。どのメソッドを呼び出すかは、実行時ではなくコンパイル時に決定されます。C++ の主なアイデアは、C と同じくらい効率的でありながら、オブジェクト指向言語構造をコンパイル時に静的型チェックとともに提供して、実行時のエラー検出への依存を軽減し、追加のオーバーヘッドを削減することです。
class Joe {
public:
virtual int thingOne() { return 1;} // standard, not pure virtual method
..
};
class JoeTwo : public Joe {
public:
int thingOne() { return 2;} // derived class provides its own version of the method
..
};
Joe *myJoe = new JoeTwo;
int i = myJoe->thingOne(); // value of 2 put into i and not value of 1
C++ では、派生オブジェクトを含む変数が派生オブジェクトのスーパー クラスを含む変数に割り当てられるときに発生する可能性があるオブジェクト スライスのため、オブジェクトとオブジェクトへのポインターの違いを認識する必要があります。この「オブジェクトのスライス」は、派生オブジェクトが派生元の基本クラスまたはスーパークラス オブジェクトに適合しないために発生します。派生オブジェクトには、スーパー クラス オブジェクトにはない追加要素があるため、代入 (デフォルトの代入は単純なメモリ コピーです) では、派生オブジェクトのスーパー クラス部分のみがスーパー クラス オブジェクトにコピーされます。
class Joe {
public:
virtual int thingOne() { return 1;} // standard, not pure virtual method
..
};
class JoeTwo : public Joe {
public:
int thingOne() { return 2;} // derived class provides its own version of the method
..
};
Joe *myJoe = new JoeTwo; // no object slicing since this is pointer
JoeTwo myJoeTwo;
Joe myJoeSliced = myJoeTwo; // JoeTwo object myJoeTwo sliced to fit into Joe object myJoeSliced