抽象类、接口与mixin
核心对比
| 抽象类 | 接口 | mixin | |
|---|---|---|---|
| 关键字 | abstract class |
无,用 abstract class / class |
mixin |
| 使用方式 | extends |
implements |
with |
| 多继承 | 仅单继承 | 可实现多个接口 | 可使用多个 mixin |
| 有无构造函数 | ✅ | ❌ | ❌ |
| 可否实例化 | ❌ | ❌ | ❌ |
| 能力复用 | 子类可复用抽象类中已实现的方法 | 不可复用 | 可复用 |
| 方法是否必须重写 | 抽象方法必须 | 所有 | 可选 |
| 使用场景 | 定义基类 | 定义行为规范 | 工具类 |
抽象类
通过 abstract class 关键字定义。
dart
typescript
// 抽象类:定义动物规范
abstract class Animal {
// 成员变量
String name;
// 构造函数
Animal(this.name);
// 抽象方法(必须实现)
void makeSound();
// 普通方法(已有实现,可直接用)
void eat() {
print("$name is eating");
}
}
// 子类继承抽象类
class Dog extends Animal {
// 调用父类构造
Dog(String name) : super(name);
// 必须实现抽象方法
@override
void makeSound() {
print("Woof!");
}
}
void main() {
// Animal(); ❌ 抽象类不能实例化
final dog = Dog("Buddy");
dog.makeSound(); // Woof!
dog.eat(); // Buddy is eating
}
特性
- 不能实例化,使用
extends继承 - 可继承抽象类的所有成员(变量 & 方法)
- 子类需实现所有抽象方法,可选择性的覆写抽象类中已实现的方法
- Dart 为单继承语言
设计目的
提供通用能力 + 规范,通常用于定义基类,如 BaseWidget。
接口
Dart 中无 interface 关键字,通过 abstract class 或 class 定义的类既是抽象类,也是接口。
objectivec
csharp
class Flyable {
void fly();
}
特性
- 需实现接口中的所有成员(变量 & 方法)
- 可实现多个接口
- 不能继承
class中已实现的方法
设计目的
定义规范 + 约束。当类 A 想实现类 B 中的 API,而不想继承 B 的实现时,可通过 A implements B 实现。
mixin(混入)
是一种横向复用代码的机制,通过 mixin 定义,with 使用。
objectivec
scala
mixin Logger {
void log(String message) {
print('LOG: $message');
}
}
class UserService with Logger {
void createUser() {
log('User created');
}
}
特性
- 可定义变量、方法
- 通过 on 关键字约束使用范围,如
mixin A on State,只有 State 及其子类可使用 mixin A。 - 冲突处理:后混入的会覆盖先混入的同名成员
设计目的
- 不破坏类层级
- 可组合使用多个能力
- 架构解耦