Dart中如何在一个类的mixin内调用另一类被mixin扩展的方法
问题原因
你代码编译报错的核心原因是:MixedB仅约束在原生B类上,而原生B类的objOfA字段声明为原生A类型,someNewMethod是MixedA混入后才新增的方法,不属于原生A类的成员,编译器无法识别原生A实例有这个方法,因此抛出错误。
解决方案
根据你的业务场景可以选择以下三种方案:
方案1:直接修改
B类的字段类型(最稳妥,编译期全检查)
如果你确定B持有的所有A实例都必须混入MixedA,直接修改objOfA的声明类型即可:class A {} class B { // 直接约束objOfA为混入了MixedA的A实例 final A with MixedA objOfA; const B(this.objOfA); } mixin MixedA on A { void someNewMethod() { // do something } } mixin MixedB on B { void someMethod() { objOfA.someNewMethod(); // 可正常调用 } }方案2:将
B改造为泛型类(灵活性最高,编译期检查)
如果你的业务中B可以持有不同类型的A实例,仅当B持有的是带MixedA的A实例时才混入MixedB,可以用泛型实现:class A {} // B声明为泛型类,泛型参数约束为A的子类 class B<T extends A> { final T objOfA; const B(this.objOfA); } mixin MixedA on A { void someNewMethod() { // do something } } // MixedB仅约束在持有混入MixedA的A实例的B类型上 mixin MixedB<T extends A with MixedA> on B<T> { void someMethod() { objOfA.someNewMethod(); // 可正常调用 } }方案3:显式类型转换(改造成本最低,有运行时风险)
如果你不想修改原有类的定义,可以在调用时显式强转,该方案需要你自行保证运行时objOfA确实混入了MixedA,否则会抛出类型转换异常:mixin MixedB on B { void someMethod() { (objOfA as MixedA).someNewMethod(); } }
内容的提问来源于stack exchange,提问作者rajveermalviya
相关产品推荐
相关产品推荐

