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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:27:02