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
とマークできます
abstract
として宣言できます
abstract
として宣言できます
super(..)
は基底コンストラクタを明示的に呼び出すのに使えます
クラスオブジェクトにおいて、==
と!=
演算子はオブジェクトの内容を比較します。
したがって、null
は内容を持たないため、null
との比較は不正です。
is
演算子は同一性(アイデンティティ)を比較します。非同一性の比較には、e1 !is e2
を使います。
MyClass c;
if (c == null) // エラー
...
if (c is null) // ok
...
struct
オブジェクトではすべてのビットが比較され、その他のオペランドの型において、同一性は等価性と同じです。