You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何会调用GB的init方法?Dart混入(mixin)执行逻辑疑问

问题:为何PB覆盖GB的init方法后,执行时仍会调用GB的init?

示例代码

abstract class BB {
  BB() {
    print('BB Constructor');
    init();
  }
  init() {
    print('BB init');
  }
}

mixin GB on BB {
  @override
  init() {
    super.init();
    print('GB init');
  }
}

mixin PB on BB {
  @override
  init() {
    super.init();
    print('PB init');
  }
}

class WFB extends BB with GB,PB {}

执行输出

BB Constructor
BB init
GB init
PB init

原因解释

这是Dart中mixin的线性化调用机制导致的:

  • 当你用extends BB with GB, PB定义类WFB时,Dart会构建一条明确的调用链:BB → GB → PB → WFB
  • 每个mixin里的super并不是直接指向父类BB,而是指向调用链中前一个节点:
    • PB的super.init()实际调用的是GB的init方法
    • GB的super.init()实际调用的是BB的init方法
  • 实例化WFB时,BB的构造函数调用init(),此时实际触发的是调用链最末端的PB的init方法。而PB的init里通过super.init()触发了GB的init,GB的init再通过super.init()触发BB的init,最终就形成了你看到的输出顺序。

简单说,这里的“覆盖”不是完全替换,而是mixin通过super把各个方法串联成了一个执行链,只要每个mixin里都调用了super方法,链上的所有对应方法都会被依次执行。

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:42:07