普通视图

发现新文章,点击刷新页面。
昨天以前掘金 前端

Flutter 抽象类、接口与mixin

作者 可有道理
2026年5月6日 23:41

抽象类、接口与mixin

核心对比

抽象类 接口 mixin
关键字 abstract class 无,用 abstract class / class mixin
使用方式 extends implements with
多继承 仅单继承 可实现多个接口 可使用多个 mixin
有无构造函数
可否实例化
能力复用 子类可复用抽象类中已实现的方法 不可复用 可复用
方法是否必须重写 抽象方法必须 所有 可选
使用场景 定义基类 定义行为规范 工具类

抽象类

通过 abstract class 关键字定义。

dart

// 抽象类:定义动物规范
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 classclass 定义的类既是抽象类,也是接口。

objectivec

class Flyable {
  void fly();
}

特性

  • 需实现接口中的所有成员(变量 & 方法)
  • 可实现多个接口
  • 不能继承 class 中已实现的方法

设计目的

定义规范 + 约束。当类 A 想实现类 B 中的 API,而不想继承 B 的实现时,可通过 A implements B 实现。

mixin(混入)

是一种横向复用代码的机制,通过 mixin 定义,with 使用。

objectivec

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。
  • 冲突处理:后混入的会覆盖先混入的同名成员

设计目的

  • 不破坏类层级
  • 可组合使用多个能力
  • 架构解耦
❌
❌