Dart递归Mixin创建问题:代码报错与实现需求咨询
解决Dart递归Mixin的实现问题
你的核心需求是:Mixin添加到基类时,_list与list内容一致;子类继承带Mixin的基类并重写list后,子类的_list需包含基类的list内容。你遇到的lint冲突,本质是Dart静态类型检查和递归Mixin动态类型判断的矛盾,下面给出两种可行方案:
方案一:用基类终止递归(推荐)
通过定义基类作为递归起点,完全规避类型转换的lint问题:
// 定义Mixin,约束为自身子类型,确保super是A的实例 mixin A<T extends Object> on A<T> { List<Object?> get list; List<Object?> get _list => [...super._list, ...list]; } // 基类:作为递归终止点,直接让_list等于list class BaseModel<T extends Object> with A<T> { @override List<Object?> get list => ['base data']; @override List<Object?> get _list => list; } // 子类:继承基类并重写list,自动递归合并内容 class SubModel<T extends Object> extends BaseModel<T> { @override List<Object?> get list => ['sub data']; }
测试效果:
BaseModel()._list返回['base data'],符合基类需求SubModel()._list返回['base data', 'sub data'],自动合并基类与子类的list内容
方案二:保留Object约束,抑制lint提示
如果不想额外定义基类,可保留on Object约束,通过忽略lint提示解决类型转换的矛盾:
mixin A<T extends Object> on Object { List<Object?> get list; List<Object?> get _list { final superList = super is A ? (super as A<T>)._list // ignore: unnecessary_cast : <Object?>[]; return [...superList, ...list]; } } // 基类使用Mixin class BaseModel<T extends Object> with A<T> { @override List<Object?> get list => ['base data']; } // 子类继承基类并重写list class SubModel<T extends Object> extends BaseModel<T> { @override List<Object?> get list => ['sub data']; }
这里的// ignore: unnecessary_cast是必要的:运行时super is A为真时转换确实多余,但Dart静态类型检查无法提前推断super的具体类型,必须显式转换才能访问_list成员,通过ignore可消除lint警告。
内容的提问来源于stack exchange,提问作者FMorschel
相关产品推荐
相关产品推荐

