Flutter 抽象类、接口与mixin

35 阅读1分钟

抽象类、接口与mixin

核心对比

抽象类接口mixin
关键字abstract class无,用 abstract class / classmixin
使用方式extendsimplementswith
多继承仅单继承可实现多个接口可使用多个 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。
  • 冲突处理:后混入的会覆盖先混入的同名成员
mixin A {
  void run() => print('A');
}

mixin B {
  void run() => print('B');
}

class C with A, B {}

结果

C().run(); // 输出 B

设计目的

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