Миксины
Что такое Миксины?
Mixin или Примеси содержат свой уже реализованный функционал с методами и свойствами.
Этот готовый функционал можно примешать в существующие классы, который они будут использовать.
Главная фишка, что таких примесей можно примешать сколько угодно (некая замена множественному наследованию)
Отличия от наследования в том, что при наследовании классы должны быть связаны по смыслу. Миксины же представляют собой отдельную функциональную единицу, любой миксин можно примешать к любому классу (Если только вручную не указать для каких классов используется миксин)
Важный момент, что в отличии от интерфейсов, где мы говорим классу только что должны быть у методов и свойств, то с помощью миксинов мы сразу примешиваем реализованный функционал!
Создание Миксинов
Dart - Определение миксинов
mixin DefensibleMixin {
double? defense;
void shield(double defense) {
this.defense = defense;
print('Временно увеличить показатель брони на $defense у себя и союзников');
}
void aggress() {
print('Агрить ближайших врагов на большом расстоянии');
}
}
mixin WarriorableMixin {
double? attack;
void powerfulAttack() {
print('Нанести мощную атаку');
}
}
// ! Данный миксин можно примешать только к наследникам класса Archer
// ! on Archer
mixin BalistickableMixin on Archer {
void shootToTarget() {
print('Пустить снаряд точно в цель!');
}
}
Использование миксинов
Использование миксинов через ключевое слово with
Dart - Применение миксинов
class Paladin with DefensibleMixin, WarriorableMixin {}
// Ошибка! Только наследники Archer могут примешать BalistickableMixin
class CrazyProphet extends Paladin with BalistickableMixin {}
class Archer {}
class WoodElf extends Archer with WarriorableMixin, BalistickableMixin {}
Dart - Пример использования
void main() {
Paladin paladin = Paladin();
paladin.shield(20);
paladin.aggress();
paladin.powerfulAttack(20);
WoodElf elf = WoodElf();
elf.shootToTarget();
elf.powerfulAttack(100);
}
Результат
Временно увеличить показатель брони на 20.0 у себя и союзников
Агрить ближайших врагов на большом расстоянии
Нанести мощную атаку 20.0 урона
Пустить снаряд точно в цель!
Нанести мощную атаку 100.0 урона
Польза от Миксинов
Миксины позволяют добавлять функциональность к классам без необходимости создавать иерархию наследования, что обеспечивает большую гибкость.