如何在 dart 中同时对接口使用受限的 mixin 和该接口的实现?

How to use restricted mixin to an interface with implementation of that interface at same time in dart?

我有:

  1. 具有必须重写的方法的接口 (InterfaceA)。
  2. 限制为使用我想在不覆盖的情况下使用的方法的接口 mixin (MixinB)。
  3. Class (ClassC) 实现了接口和 mixin 的使用。

问题: 是否可以同时使用受限的 mixin 与该接口的实现进行交互?

下面的代码是一个示例,展示了我理想中如何使用 mixin 和接口

abstract class InterfaceA {
  int getValue();
}

mixin MixinB on InterfaceA {
  int getPreValue(int i) => i;
}

// Error:
// 'Object' doesn't implement 'InterfaceA' so it can't be used with 'MixinB'.
class ClassC with MixinB implements InterfaceA {
  @override
  getValue() => getPreValue(2);
}

您的 mixin 不需要 用于 InterfaceA 类型的 class。 您可以将其声明为

mixin MixinB implements InterfaceA {
  in getPrevAlue(int i) => i;
}

相反。然后使用 mixin 将需要 mixin 应用程序 class 实现 InterfaceA,因为 mixin 不提供实现,但它可以在 mixin 之前或之后这样做。 那么你的代码就是:

class ClassC with MixinB { // no need for `implements InterfaceA`
  @override
  getValue() => getPreValue(2);
}

如果您需要 调用 on 类型的 super-interface 成员,则仅对混入使用 on 要求使用 super.memberName。否则只需使用 implements 来确保生成的对象将实现该接口。您仍然可以在界面上进行正常的虚拟调用。

示例:

abstract class MyInterface {
  int get foo;
}
mixin MyMixin implements MyInterface {
  int get bar => this.foo; // Valid!
}
class MyClass with MyMixin {
  @override
  int get foo => 42;
  int useIt() => this.bar; // returns 42
}