Classes

O D oferece suporte a classes e interfaces como em Java ou C++.

Qualquer tipo de class herda implicitamente do Object (objeto).

class Foo { } // herda de Object
class Bar : Foo { } // Bar é imcorporado ao Foo

As classes em D geralmente são instanciadas no heap usando new:

auto bar = new Bar;

Os objetos de classe são sempre tipos de referência e, ao contrário do struct, não são copiados por valor.

Bar bar = foo; // bar aponta para foo

O coletor de lixo garantirá que a memória seja liberada quando não houver mais referências a um objeto.

Herança

Se uma função de membro de uma classe base for substituída, a palavra-chave override deve ser usada para indicar isso. Isso evita a substituição não intencional sobreposição não intencional de funções.

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

Em D, as classes só podem herdar de uma classe.

Funções de membro Final e abstract

  • Uma função pode ser declarada como final em uma classe base para não permitir a sobreposição dela
  • Uma função pode ser declarada como abstract para forçar as classes derivadas a sobrepor ela
  • Uma classe inteira pode ser declarada como abstract para garantir que que ela não seja instanciada
  • super(...) pode ser usado para chamar explicitamente o construtor da base

Verificação de equivalência

Para objetos de classe, os operadores == e != comparam o conteúdo dos objetos. Portanto, a comparação com null é inválida, pois null não tem conteúdo. O is compara a equivalência. Para comparar a não-equivalência, use e1 !is e2.

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

Para objetos struct, todos os bits são comparados, para outros tipos de operandos, equivalência é o mesmo que igualdade.

Maiores detalhes

rdmd playground.d