Dart Mixins
最后修改:2025 年 2 月 15 日
在本文中,我们将展示如何在 Dart 语言中使用 **mixins**。Mixins 是一种在不使用继承的情况下跨多个类层次结构重用代码的方式。它们允许您在不创建完整的父子关系的情况下向类添加功能。
当您想在不共享共同祖先的类之间共享行为时,Mixins 特别有用。它们使用 mixin 关键字声明,并可以使用 with 关键字添加到类中。
Dart Mixins 简单示例
以下示例演示了如何在 Dart 中创建和使用简单的 mixin。
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 可以与多个类一起使用以共享公共行为。
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 用于 User 和 Admin 类,以共享日志记录功能。
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!');
}
}
User 和 Admin 类都使用 Logging mixin 来记录消息。
$ dart main.dart Log: User Alice says hello! Log: Admin Bob makes an announcement!
Dart Mixins 与覆盖
Mixins 可以覆盖其使用的类中的方法。
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 关键字指定约束,以限制它们的使用仅限于特定类。
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 的基本用法。Mixins 是代码重用的强大功能,可用于在多个类之间共享行为。
作者
列出 所有 Dart 教程。