インターフェイス
インターフェイス宣言
インターフェイスは、インターフェイスを継承するクラスが実装しなければならない関数のリストを記述したものである。 を継承するクラスが実装しなければならない関数のリストを記述する。
InterfaceDeclaration: interface Identifier ; interface Identifier BaseInterfaceListopt AggregateBody InterfaceTemplateDeclaration BaseInterfaceList: : Interfaces
特殊なインターフェイスがサポートされることもある:
- COMインターフェース は、Windows用のCOM/OLE/ActiveXオブジェクトとバイナリ互換である。
- C++とのインターフェイス は、C++ 抽象クラスとバイナリ互換である。
- Objective-Cとのインターフェイス は Objective-C プロトコルとバイナリ互換である。
あるインターフェイスを実装したクラスは、暗黙のうちにそのインターフェイスへの参照に変換することができる。 に暗黙的に変換できる。
インターフェースはクラスから派生することはできない。 クラスはインターフェイスから複数回派生することはできない。
interface I { void foo(); } class A : I, I // エラー、インターフェイスが重複している { }
インターフェイスのインスタンスは作成できない。
interface I { void foo(); } ... I iface = new I(); // エラー、インターフェイスのインスタンスを作成できない
インターフェース・メソッド本体
仮想インターフェイスのメンバ関数は実装を持たない。 インターフェースは静的関数または最終関数を実装することが期待されている。
interface I { void bar() { } // エラー、実装が許可されていない static void foo() { } // OK final void abc() { } // OK }
インターフェースはメンバーに関数テンプレートを持つことができる。 インスタンス化された関数はすべて暗黙的にfinal 。
interface I { void foo(T)() { } // OK、暗黙的にfinalである }
インターフェイスを継承するクラスは、インターフェイスのメンバ関数をオーバーライドすることはできない。 staticメンバ関数をオーバーライドしてはならない。
interface I { void bar(); static void foo() { } final void abc() { } } class C : I { void bar() { } // OK void foo() { } // static I.foo()をオーバーライドできない void abc() { } // エラー、final I.abc()をオーバーライドできない }
インターフェイスを実装する
すべての仮想インターフェイス関数は、そのインターフェイスを継承するクラスで定義されなければならない。 で定義されなければならない:
interface I { void foo(); } class A : I { void foo() { } // OK、実装を提供する } class B : I { int foo() { } // エラー、`void foo()`の実装がない }
インターフェースは基底クラスから継承し、インターフェース関数をオーバーライドすることができる:
interface I { int foo(); } class A : I { int foo() { return 1; } } class B : A { override int foo() { return 2; } } B b = new B(); assert(b.foo() == 2); I i = b; // BはAのIの実装を継承しているので、OKである assert(i.foo() == 2);
インターフェイスを再実装する
インターフェイスは派生クラスで再実装することができる:
interface I { int foo(); } class A : I { int foo() { return 1; } } class B : A, I { override int foo() { return 2; } } B b = new B(); assert(b.foo() == 2); I i = b; assert(i.foo() == 2); A a = b; I i2 = a; assert(i2.foo() == 2); // i2は、B.fooを指すfooに対するAの仮想ポインタを持つ
インターフェイスの再実装は、すべてのインターフェイス関数を実装しなければならない。 関数を実装しなければならず、スーパークラスから継承することはできない:
interface I { int foo(); } class A : I { int foo() { return 1; } } class B : A, I { } // エラー、インタフェースIのfoo()がない
インターフェイス・メソッドの契約
インターフェイスのメンバ関数は、関数本体がなくても契約を持つことができる。 を持つことができる。契約は、そのインターフェイス・メンバ関数を実装したクラス・メンバ関数に継承される。 クラス・メンバ関数に継承される。
interface I { int foo(int i) in { assert(i > 7); } out (result) { assert(result & 1); } void bar(); }
Constと不変インターフェイス
インターフェイスがconst 、またはimmutable 。 クラスを持つ場合、インターフェイスのすべてのメンバは const またはimmutable 。 このストレージ・クラスは継承されない。
COMインターフェイス
インタフェースの変形として、COMインタフェースがある。COMインターフェースは WindowsのCOMオブジェクトに直接マッピングするように設計されている。任意のCOMオブジェクト をCOMインターフェースで表現することができる。 を持つDオブジェクトは、外部のCOMクライアントで使用することができる。
COM インタフェースは、以下のインタフェースから派生したものとして定義される。 core.sys.windows.com.IUnknown に由来するものと定義される。COMインターフェースは、以下の点で通常のDインターフェースと異なる。 通常の D インターフェースとは異なる:
- core.sys.windows.com.IUnknown インターフェースから派生している。
- の引数にはできない。 destroy.
- への引数にすることはできない。 また、派生インターフェースにダウンキャストすることもできない。 また、派生インターフェースにダウンキャストすることもできない。QueryInterface() を実装する。
- COM インタフェースから派生したクラスは COM クラスである。
- COM クラスのメンバ関数のデフォルト・リンケージは である。
はextern(System) である。
注釈:D インターフェースまたはクラス( から継承していないもの)のベースクラスメソッドを実装またはオーバーライドする。 D インターフェースまたはクラス(IUnknown を継承していないもの)のベース・クラス・メソッドを実装またはオーバーライドするには、 のリンケージを持つものとして明示的にマークする、 extern(D) を継承していないもの)を実装またはオーバーライドする。
import core.sys.windows.windows; import core.sys.windows.com; interface IText { void write(); } abstract class Printer : IText { void print() { } } class C : Printer, IUnknown { // IText `write`クラスメソッドを実装する。 extern(D) void write() { } // Printer `print`クラスメソッドをオーバーライドする。 extern(D) override void print() { } // Object基底クラスの`toString`メソッドをオーバーライドする。 extern(D) override string toString() { return "Class C"; } // IUnknownインターフェースを実装するクラスのメソッドには // デフォルトではextern(System)の呼び出し規約を持つ。 HRESULT QueryInterface(const(IID)*, void**); uint AddRef(); uint Release(); }
opCmp 、toHash などの他のObject メソッドも同様である。
- COMvtbl[] の最初のメンバは、InterfaceInfo へのポインタではなく、最初の仮想関数ポインタである。 へのポインタではなく、最初の仮想関数ポインタである。
以下も参照のこと。 D言語による最新のCOMプログラミング
C++とのインターフェイス
C++インターフェイスとは、C++のリンケージを使って宣言されたインターフェイスのことである:
extern (C++) interface Ifoo { void foo(); void bar(); }これは、以下のC++宣言に対応するものである:
class Ifoo { virtual void foo(); virtual void bar(); };
C++のインターフェイスから派生したインターフェイスもまた、C++とのインターフェイスである。 C++とのインターフェイス" である。 C++とのインターフェイスがDインターフェイスと異なるのは、以下の点である:
- の引数にはできない。 destroy.
- への引数にすることはできない。 派生インターフェースにダウンキャストすることもできない。
- C++の呼び出し規約は、メンバ関数のデフォルト規約である。 C++の呼び出し規約は、D呼び出し規約ではなく、メンバ関数のデフォルト規約である。
- vtbl[] の最初のメンバは、 へのポインタではない。 Interface へのポインタではなく、最初の仮想関数ポインタである。
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku