D supporte les classes et les interfaces comme en Java ou en C++.
Toutes les classes héritent de Object
implicitement:
class Foo { } // hérite de Object
class Bar : Foo {} // Bar est également un Foo
Les classes en D sont généralement instanciées sur le tas en utilisant new
:
auto bar = new Bar;
Les objets de type classe sont toujours des types par référence et contrairement aux struct
ne sont pas copiés par valeur :
Bar bar = foo; // bar pointe vers foo
Le ramasse-miette s'assurera que la mémoire est libérée quand il n'y a plus aucune référence vers un objet.
Si une méthode d'une classe de base est surchargée, le mot clé override
doit être utilisé pour l'indiquer. Cela protège des surcharges accidentelles de fonctions :
class Bar : Foo {
override fonctionDeFoo() {}
}
En D, les classes ne peuvent hériter que d'une seule classe.
final
et abstract
final
dans une classes parente pour empêcher la surchage dans les classes filles
abstract
dans une classe parente pour forcer la surcharge dans les classes filles
abstract
pour empêcher qu'elle ne soit instanciée
super(...)
peut être utilisé pour appeller explicitement le constructeur de base.
Pour les objets de type classe, les opérateurs ==
et !=
comparent le contenu des objets. De ce fait, comparer une classe avec null
est une erreur, puisque null
n'a pas de contenu. L'opérateur is
compare deux classes pour voir si elles sont identiques. Pour tester la différence, utilisez e1 !is e2
:
MaClasse c;
if(c == null) // ERREUR
//...
if(c is null) // ok
//...
Les struct
s sont comparées bit à bit lorsqu'utilisées avec is
. Pour les autres types, l'identité est équivalent à l'égalité.