首页 > 解决方案 > 如何在另一个类的另一个混合中使用一个类的混合方法

问题描述

我有class B哪个对象class A作为成员字段。而且我想class A访问class B. 我尝试了以下但它不起作用。

https://dartpad.dev/?id=2af929e713c46e9b853aee84f4407007&null_safety=true

class A {}

class B {
  final A objOfA;
  const B(this.objOfA);
}

mixin MixedA on A {
  void someNewMethod() {
    // do something
  }
}

mixin MixedB on B {
  void someMethod() {
    objOfA.someNewMethod(); // <-- error
  }
}

标签: dart

解决方案


mixin MixedB on B意味着使用的类MixedB只知道派生自B. 类B不保证其objOfA成员是MixedA. 您的一些选择:

  • 通过将其B声明objOfAMixedAfinal MixedA objOfA;

  • 如果你不能无条件地声明objOfA为 a MixedA,也许你可以使Bgeneric 并 make MixedBrequire 一个专门的基类型:

    class B<DerivedA extends A> {
      final DerivedA objOfA;
      const B(this.objOfA);
    }
    
    mixin MixedB on B<MixedA> {
      // ...
    }
    
  • MixedB执行运行时检查:

    mixin MixedB on B {
      void someMethod() {
        final objOfA = this.objOfA;
        if (objOfA is MixedA) {
          objOfA.someNewMethod();
        }
      }
    }
    
  • 如果您可以亲自保证objOfA将始终使用MixedAwhen MixedB(但您不能提供静态的编译时保证),则可以进行MixedB覆盖objOfA并将其强制转换为MixedB

    mixin MixedB on B {
      @override
      MixedA get objOfA => super.objOfA as MixedA;
    
      void someMethod() {
        objOfA.someNewMethod();
      }
    }  
    

推荐阅读