ZetCode

Dart Mixins

最后修改:2025 年 2 月 15 日

在本文中,我们将展示如何在 Dart 语言中使用 **mixins**。Mixins 是一种在不使用继承的情况下跨多个类层次结构重用代码的方式。它们允许您在不创建完整的父子关系的情况下向类添加功能。

当您想在不共享共同祖先的类之间共享行为时,Mixins 特别有用。它们使用 mixin 关键字声明,并可以使用 with 关键字添加到类中。

Dart Mixins 简单示例

以下示例演示了如何在 Dart 中创建和使用简单的 mixin。

main.dart
mixin Logging {
  void log(String message) {
    print('Log: $message');
  }
}

class User with Logging {
  String name;

  User(this.name);

  void greet() {
    log('User $name says hello!');
  }
}

void main() {
  final user = User('Alice');
  user.greet();
}

在此程序中,我们定义了一个提供 log 方法的 Logging mixin。然后,我们在 User 类中使用此 mixin 来记录问候消息。

mixin Logging {
  void log(String message) {
    print('Log: $message');
  }
}

我们定义了一个名为 Logging 的 mixin,其中包含一个 log 方法。

class User with Logging {
  String name;

  User(this.name);

  void greet() {
    log('User $name says hello!');
  }
}

我们创建了一个使用 with 关键字的 Logging mixin 的 User 类。greet 方法使用来自 mixin 的 log 方法。

void main() {
  final user = User('Alice');
  user.greet();
}

我们创建了 User 类的一个实例,并调用了 greet 方法,该方法记录了一条消息。

$ dart main.dart
Log: User Alice says hello!

Dart Mixins 与多个类

Mixins 可以与多个类一起使用以共享公共行为。

main.dart
mixin Logging {
  void log(String message) {
    print('Log: $message');
  }
}

class User with Logging {
  String name;

  User(this.name);

  void greet() {
    log('User $name says hello!');
  }
}

class Admin with Logging {
  String name;

  Admin(this.name);

  void announce() {
    log('Admin $name makes an announcement!');
  }
}

void main() {
  final user = User('Alice');
  user.greet();

  final admin = Admin('Bob');
  admin.announce();
}

在此程序中,我们将 Logging mixin 用于 UserAdmin 类,以共享日志记录功能。

class User with Logging {
  String name;

  User(this.name);

  void greet() {
    log('User $name says hello!');
  }
}

class Admin with Logging {
  String name;

  Admin(this.name);

  void announce() {
    log('Admin $name makes an announcement!');
  }
}

UserAdmin 类都使用 Logging mixin 来记录消息。

$ dart main.dart
Log: User Alice says hello!
Log: Admin Bob makes an announcement!

Dart Mixins 与覆盖

Mixins 可以覆盖其使用的类中的方法。

main.dart
mixin Logging {
  void log(String message) {
    print('Log: $message');
  }
}

class User with Logging {
  String name;

  User(this.name);

  void log(String message) {
    print('User Log: $message');
  }

  void greet() {
    log('User $name says hello!');
  }
}

void main() {
  final user = User('Alice');
  user.greet();
}

在此程序中,User 类覆盖了 Logging mixin 的 log 方法。

void log(String message) {
  print('User Log: $message');
}

User 类覆盖了 log 方法,以提供自定义日志记录行为。

$ dart main.dart
User Log: User Alice says hello!

Dart Mixins 与约束

Mixins 可以使用 on 关键字指定约束,以限制它们的使用仅限于特定类。

main.dart
class Person {
  String name;

  Person(this.name);
}

mixin Logging on Person {
  void log(String message) {
    print('Log: $name says $message');
  }
}

class User extends Person with Logging {
  User(String name) : super(name);

  void greet() {
    log('Hello!');
  }
}

void main() {
  final user = User('Alice');
  user.greet();
}

在此程序中,Logging mixin 被约束为只能与扩展 Person 的类一起使用。

mixin Logging on Person {
  void log(String message) {
    print('Log: $name says $message');
  }
}

Logging mixin 使用 on 关键字指定它只能与扩展 Person 的类一起使用。

class User extends Person with Logging {
  User(String name) : super(name);

  void greet() {
    log('Hello!');
  }
}

User 类扩展了 Person 并使用了 Logging mixin。

$ dart main.dart
Log: Alice says Hello!

来源

Dart Mixins - 语言文档

在本文中,我们涵盖了 Dart 中 mixins 的基本用法。Mixins 是代码重用的强大功能,可用于在多个类之间共享行为。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出 所有 Dart 教程