Clases

D tiene clases e interfaces de la misma forma que las tienen Java y C++.

Cualquier clase (declarada con la palabra reservada class) hereda de forma implícita de la clase base Object.

class Foo { } // hereda de Object
class Bar : Foo { } // Bar también es Foo

Las clases en D son generalmente instanciadas mediante la palabra reservada new y la memoria se reserva en el heap:

auto bar = new Bar;

Las instancias de las clases son siempre referencias y, al contrario que las estructuras (structs), nunca son copiadas por valor.

Bar bar = foo; // bar apunta a foo

El recolector de basura (garbage collector en inglés) es el encargado de liberar la memoria usada por las instancias cuando ya no exista ninguna referencia a una instancia dada.

Herencia

Si una función miembro (o método) de la clase base se sobreescribe, se debe usar la palabra reservada override para indicarlo. Esto previene que se sobreescriban métodos de forma no intencionada.

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

En D, las clases sólo pueden heredar de una sola clase.

Funciones miembro finales y abstractas

  • Una función se puede marcar en la clase base con la palabra reservada final para impedir que sea sobreescrita.
  • Una función se puede declarar usando la palabra reservada abstract para forzar a las clases derivadas a que tengan que sobreescribirla.
  • Una clase completa se puede declarar usando la palabra reservada abstract para asegurarse de que nunca pueda ser instanciada.
  • super(...) se puede usar para llamar de forma explícita al constructor de la clase base.

Comprobación de identidad

Para las instancias de las clases, los operadores == y != comparan los contenidos de dichas instancias, por lo que comparar contra el valor null no es válido, ya que null no tiene ningún contenido. Es el operador is el que compara identidades (si dos instancias son la misma o si una instancia es null). El operador !is es la operación contraria.

MyClass c;
if (c == null)  // error
    ...
if (c is null)  // ok
    ...

En las estructuras (structs) los objetos se comparan bit a bit. Para otros operadores la identidad es lo mismo que la igualdad.

En profundidad

rdmd playground.d