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.
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.
final
para impedir que sea sobreescrita.
abstract
para
forzar a las clases derivadas a que tengan que sobreescribirla.
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.
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 (struct
s) los objetos se comparan bit a bit. Para otros
operadores la identidad es lo mismo que la igualdad.