← Назад к вопросам

В чем разница между mixin и extension?

1.8 Middle🔥 161 комментариев
#Dart

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Mixin и Extension - две техники для расширения функциональности

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

Mixin - переиспользование через смешивание

mixin Logger {
  void log(String message) {
    print("[LOG] $message");
  }
}

mixin Validator {
  bool validate(String input) {
    return input.isNotEmpty;
  }
}

class User with Logger, Validator {
  String name = "John";
  
  void save() {
    if (validate(name)) {
      log("User saved");
    }
  }
}

Параметры:

  • Может содержать переменные и состояние
  • Может быть использован в нескольких классах
  • Применяется при создании класса с with
  • Часть иерархии типов

Extension - добавление методов к типам

extension StringHelper on String {
  String capitalize() {
    return "${this[0].toUpperCase()}${substring(1)}";
  }
  
  bool isValidEmail() {
    return contains("@");
  }
}

print("john".capitalize());  // John
print("john@mail.com".isValidEmail());  // true

Параметры:

  • НЕ может содержать состояние
  • Работает с любыми типами, включая встроенные
  • Применяется при использовании типа
  • НЕ часть иерархии типов

Примеры

Mixin с состоянием:

mixin Timestamped {
  DateTime? createdAt;
  
  void markCreated() {
    createdAt = DateTime.now();
  }
}

class Document with Timestamped {
  String title = "Doc";
}

final doc = Document();
doc.markCreated();
print(doc.createdAt);

Extension для встроенных типов:

extension on int {
  bool isEven() => this % 2 == 0;
  String toHex() => "0x${toRadixString(16)}";
}

print((4).isEven());  // true
print((255).toHex());  // 0xff

extension on List<int> {
  int sum() => fold(0, (a, b) => a + b);
  double average() => sum() / length;
}

print([1, 2, 3, 4].sum());  // 10
print([1, 2, 3, 4].average());  // 2.5

Сравнение

ВопросMixinExtension
Содержит состояние?ДаНет
Может наследовать?ДаНет
Для встроенных типов?НетДа
ПрименениеwithНа использование
Иерархия типовДаНет

Когда использовать

Mixin:

  • Функциональность, которая нужна нескольким классам
  • Требует хранения состояния
  • Сложная логика инициализации

Extension:

  • Вспомогательные методы
  • Удобство использования
  • Работа с встроенными типами
  • Небольшие утилиты без состояния

Оба инструмента важны. Используй их правильно для чистого и переиспользуемого кода.

В чем разница между mixin и extension? | PrepBro