Dart中继承的字段为何不能直接作为构造函数初始化参数?
报错原因
- Dart 中的
this.构造参数属于初始化形式参数,语法层面仅支持初始化当前类直接定义的实例字段,不支持给从父类、mixin 继承得到的字段赋值。 - 初始化形式参数的执行时机早于类实例的完整初始化流程,设计上就规避了对继承层级字段的直接初始化操作,因此即使你在类实例创建完成后可以正常读写
x、y字段,也无法在构造函数中用该语法初始化继承字段。 - mixin 本身不支持声明构造函数,因此mixin中定义的字段更无法通过父类构造传参的方式完成初始化,只能在子类构造逻辑中手动赋值。
修复方案
你可以把构造参数改为普通形参,在构造函数体中手动给继承字段赋值即可,示例代码如下:
class X{ double? x; } mixin Y{ double? y; } class Z extends X with Y { double? z; // 把this.x、this.y改为普通形参,this.z保留初始化形式参数 Z(double? x, double? y, this.z) { // 构造函数体中手动给继承字段赋值 this.x = x; this.y = y; } }
如果父类支持构造传参,也可以结合super参数简化父类字段的初始化:
class X{ double? x; // 父类声明构造函数 X(this.x); } mixin Y{ double? y; } class Z extends X with Y { double? z; // 用super.x调用父类构造初始化x字段,y字段仍需手动赋值 Z(super.x, double? y, this.z) { this.y = y; } }
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

