为何会调用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方法
- PB的
- 实例化WFB时,BB的构造函数调用
init(),此时实际触发的是调用链最末端的PB的init方法。而PB的init里通过super.init()触发了GB的init,GB的init再通过super.init()触发BB的init,最终就形成了你看到的输出顺序。
简单说,这里的“覆盖”不是完全替换,而是mixin通过super把各个方法串联成了一个执行链,只要每个mixin里都调用了super方法,链上的所有对应方法都会被依次执行。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

