如何在 dart 中同时对接口使用受限的 mixin 和该接口的实现?
How to use restricted mixin to an interface with implementation of that interface at same time in dart?
我有:
- 具有必须重写的方法的接口 (InterfaceA)。
- 限制为使用我想在不覆盖的情况下使用的方法的接口 mixin (MixinB)。
- 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
}
我有:
- 具有必须重写的方法的接口 (InterfaceA)。
- 限制为使用我想在不覆盖的情况下使用的方法的接口 mixin (MixinB)。
- 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
}