Миксины

Что такое Миксины?

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 урона

Польза от Миксинов

Миксины позволяют добавлять функциональность к классам без необходимости создавать иерархию наследования, что обеспечивает большую гибкость.