D поддерживает классы и интерфейсы подобно Java или C++.
Любой тип class неявно наследуется от Object.
class Foo { } // наследуется от Object
class Bar: Foo { } // Bar тоже является Foo
Классы в D, как правило, создаются на куче с помощью new:
auto bar = new Bar;
Объекты классов всегда являются ссылочным типом и, в отличие от структур, не копируются по значению.
Bar bar = foo; // bar - ссылка на foo
Сборщик мусора позаботится о том, чтобы память была освобождена, когда ссылок на объект не останется.
Если метод основного класса переопределяется, нужно использовать ключевое
слово override, чтобы обозначить это. Это предотвращает случайное
переопределение функций.
class Bar: Foo {
override functionFromFoo() {}
}
В D классы могут наследоваться только от одного родительского класса.
Метод может быть помечен как final в основном классе, чтобы запретить его переопределение. Метод может быть объявлен абстрактным (abstract), тогда его необходимо будет реализовать в наследующих классах. Весь класс может быть объявлен
abstract, это гарантирует, что не будет создан его экземпляр. Для доступа
к основному классу используется ключевое слово super.