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 中,类只能继承自一个类(译者注:防止了 C++ 中的菱形继承)。
final
,这样可以禁止在重写它。
abstract
,这样可以强制子类(派生类)重写它。
abstract
,这样可以保证它不能被实例化。
super(..)
来显式调用基类的构造函数。
对于类对象,==
和 !=
比较对象的内容,所以对比 null
是无效的,因为 null
没有内容。 is
关键字比较相同身份,e1 !is e2
比较不同身份。(译者注:即 is
检查指针引用)
MyClass c;
if (c == null) // 错误
...
if (c is null) // ok
...
对于 struct
对象会比较所有的比特位。对于其他类型,检查个体与内容比较相同。