クラス

DはJavaやC++のようなクラスとインターフェースのサポートを提供します。

任意のclass型はObjectを暗黙的に継承します。

class Foo { } // Objectから継承
class Bar : Foo { } // BarはFooでもある

Dのクラスは一般的にnewを使いヒープ上にインスタンス化されます:

auto bar = new Bar;

クラスオブジェクトは常に参照型であり、structとは異なり値としてコピーされません。

Bar bar = foo; // barはfooを指す

ガベージコレクタはオブジェクトへの参照が存在しなくなった時にメモリを開放します。

継承

基底クラスのメンバ関数がオーバーライドされた時、キーワードoverrideを使ってそれを示さなければなりません。 これは関数の意図しないオーバーライドを防止します。

class Bar : Foo {
    override functionFromFoo() {}
}

Dでは、クラスはクラスを1つだけ継承できます。

Finalと抽象メンバ関数

  • それをオーバーライドすることを禁止するために、基底クラス内でfinalとマークできます
  • それを派生クラスでオーバーライドすることを強制するために、関数をabstractとして宣言できます
  • それをインスタンス化されないことを確かにするために、クラス全体をabstractとして宣言できます
  • super(..)は基底コンストラクタを明示的に呼び出すのに使えます

同一性のチェック

クラスオブジェクトにおいて、==!=演算子はオブジェクトの内容を比較します。 したがって、nullは内容を持たないため、nullとの比較は不正です。 is演算子は同一性(アイデンティティ)を比較します。非同一性の比較には、e1 !is e2を使います。

MyClass c;
if (c == null)  // エラー
    ...
if (c is null)  // ok
    ...

structオブジェクトではすべてのビットが比較され、その他のオペランドの型において、同一性は等価性と同じです。

掘り下げる

rdmd playground.d