Примеси
Лите
Статья mixin-based inheritance Scala. Mixin class compositions Dart mixins-and-traits-in-swift Ruby
Примеси и множественное наследование
Примеси в D
В языке D примеси называют шаблонными примесями (template mixin). При этом примесью может быть всё, что угодно. Связано это с тем, что для использования участка кода в каче TODO
Лексические примеси в языке D
Язык D под термином mixin понимает несколько иную концепцию. Выражение mixin( ... ) позволяет на этапе компиляции вставить в исходный код программы строку, которая будет скомпилирована как код на D.
Например,
template GenStruct(string Name, string M1)
{
const char[] GenStruct = "struct " ~ Name ~ "{ int " ~ M1 ~ "; }";
}
mixin( GenStruct!("Foo", "bar") );
породит код
struct Foo{ int bar; }
Это приём метапрограммирования, который лучше сравнивать по мощности с макросами C или макросами в Scala, однако с помощью этого мощного инструмента можно реализовать и ООП-примеси в том смысле, в котором мы понимаем в этой главе.
[TODO: криво написано]
Trait'ы в Rust
Trait в Rust - описание интерфейса. Класс может заявить, что реализует trait. Шаблонный метод может потребовать от аргумента наличие некоторого trait'а. В отличие от интерфейса trait в Rust может иметь реализацию по-умолчанию. В таком случае класс может не переопределять реализацию trait'а.
[TODO: пример] Traits in Rust
Примеси в JavaScript
Примеси и аспектно-ориентированное программирование
[TODO]
Trait vs Mixin. О неустоявшейся терминологии
Mixin - общий термин, пришедший из Lisp Flavours. Изначально подразумевал реализацию методов класса отдельно от класса. Классы определяли только аттрибуты, а затем примешивали mixin'ы, реализующие методы.
Trait в PHP - это mixin в понимании остальных языков.
Trait в C++ - это приём шаблонного программирования. Для параметризации шаблона используют в дополнение к основному аргументу шаблона другой шаблонный класс, групирующий и задающий по-умолчанию свойства основного аргумента.
Trait в Rust - описание интерфейса. Класс может заявить, что реализует trait. Шаблонный метод может потребовать от аргумента наличие некоторого trait'а. Сам