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
.