英語版
このページの英語版を見る

インターフェイス

インターフェイス宣言

インターフェイスは、インターフェイスを継承するクラスが実装しなければならない関数のリストを記述したものである。 を継承するクラスが実装しなければならない関数のリストを記述する。

InterfaceDeclaration:
    interface Identifier ;
    interface Identifier BaseInterfaceListopt AggregateBody
    InterfaceTemplateDeclaration
BaseInterfaceList: : Interfaces
実装定義:

特殊なインターフェイスがサポートされることもある:

  1. COMインターフェース は、Windows用のCOM/OLE/ActiveXオブジェクトとバイナリ互換である。
  2. C++とのインターフェイス は、C++ 抽象クラスとバイナリ互換である。
  3. 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 インターフェースとは異なる:

以下も参照のこと。 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インターフェイスと異なるのは、以下の点である: