我如何解决禁止使用不同泛型实现相同接口的新 Dart 更改?
How can I work around the new Dart changes which prohibit implementing the same interface with different generics?
出于需要,我的代码相当复杂。我试图简化我正在处理的对象系统的总体布局,以便(希望)使其更易于理解。
abstract class BaseType {}
abstract class MixinTypeA implements BaseType {}
abstract class MixinTypeB<T extends MixinTypeA> implements BaseType {
Future<T> mixinMethod({bool argA = true,
bool argB = true,
bool argC = true}) =>
someMethodCall()
}
abstract class BaseTypeA extends BaseType implements MixinTypeA {
// declares a constructor
BaseTypeA();
}
abstract class BaseTypeB extends BaseType implements MixinTypeB {
// declares a constructor
BaseTypeB();
}
abstract class TypeA extends BaseTypeA {}
class TypeB extends BaseTypeB with MixinTypeB<TypeA> {}
在这种情况下,TypeB 会产生错误。这是因为它试图混合 MixinTypeB<TypeA>
。因为 TypeB 已经扩展了 BaseTypeB
,它使用推断的 <MixinTypeA>
泛型实现了 MixinTypeB
,所以 MixinTypeB
接口用两个不同的(尽管通过继承相关)接口实现了两次:TypeA
和 MixinTypeA
.
本质上,T
泛型的存在是为了让我的代码保持干爽。 MixinTypeB
中的方法示例是 class 可以具有特定类型签名 T
的各种潜在方法之一。我不知道如何在不损害此类型系统的继承结构的情况下绕过新限制。
一般来说,最常见的解决方案是通过层次结构将泛型串联起来,使类型对齐。对于这个特定示例,以下代码有效。
abstract class BaseType {}
abstract class MixinTypeA implements BaseType {}
abstract class MixinTypeB<T extends MixinTypeA> implements BaseType {
Future<T> mixinMethod({bool argA = true,
bool argB = true,
bool argC = true}) => null;
}
abstract class BaseTypeA extends BaseType implements MixinTypeA {
// declares a constructor
BaseTypeA();
}
abstract class BaseTypeB<T extends MixinTypeA> extends BaseType implements MixinTypeB<T>{
// declares a constructor
BaseTypeB();
}
abstract class TypeA extends BaseTypeA {}
class TypeB extends BaseTypeB<TypeA> with MixinTypeB<TypeA> {}
如果您不需要能够将 BaseTypeB
与 MixinTypeB
的任何其他实例混合在一起,那么以下更简单的方法也可以工作:
abstract class BaseType {}
abstract class MixinTypeA implements BaseType {}
abstract class MixinTypeB<T extends MixinTypeA> implements BaseType {
Future<T> mixinMethod({bool argA = true,
bool argB = true,
bool argC = true}) => null;
}
abstract class BaseTypeA extends BaseType implements MixinTypeA {
// declares a constructor
BaseTypeA();
}
abstract class BaseTypeB extends BaseType implements MixinTypeB<TypeA>{
// declares a constructor
BaseTypeB();
}
abstract class TypeA extends BaseTypeA {}
class TypeB extends BaseTypeB with MixinTypeB<TypeA> {}
出于需要,我的代码相当复杂。我试图简化我正在处理的对象系统的总体布局,以便(希望)使其更易于理解。
abstract class BaseType {}
abstract class MixinTypeA implements BaseType {}
abstract class MixinTypeB<T extends MixinTypeA> implements BaseType {
Future<T> mixinMethod({bool argA = true,
bool argB = true,
bool argC = true}) =>
someMethodCall()
}
abstract class BaseTypeA extends BaseType implements MixinTypeA {
// declares a constructor
BaseTypeA();
}
abstract class BaseTypeB extends BaseType implements MixinTypeB {
// declares a constructor
BaseTypeB();
}
abstract class TypeA extends BaseTypeA {}
class TypeB extends BaseTypeB with MixinTypeB<TypeA> {}
在这种情况下,TypeB 会产生错误。这是因为它试图混合 MixinTypeB<TypeA>
。因为 TypeB 已经扩展了 BaseTypeB
,它使用推断的 <MixinTypeA>
泛型实现了 MixinTypeB
,所以 MixinTypeB
接口用两个不同的(尽管通过继承相关)接口实现了两次:TypeA
和 MixinTypeA
.
本质上,T
泛型的存在是为了让我的代码保持干爽。 MixinTypeB
中的方法示例是 class 可以具有特定类型签名 T
的各种潜在方法之一。我不知道如何在不损害此类型系统的继承结构的情况下绕过新限制。
一般来说,最常见的解决方案是通过层次结构将泛型串联起来,使类型对齐。对于这个特定示例,以下代码有效。
abstract class BaseType {}
abstract class MixinTypeA implements BaseType {}
abstract class MixinTypeB<T extends MixinTypeA> implements BaseType {
Future<T> mixinMethod({bool argA = true,
bool argB = true,
bool argC = true}) => null;
}
abstract class BaseTypeA extends BaseType implements MixinTypeA {
// declares a constructor
BaseTypeA();
}
abstract class BaseTypeB<T extends MixinTypeA> extends BaseType implements MixinTypeB<T>{
// declares a constructor
BaseTypeB();
}
abstract class TypeA extends BaseTypeA {}
class TypeB extends BaseTypeB<TypeA> with MixinTypeB<TypeA> {}
如果您不需要能够将 BaseTypeB
与 MixinTypeB
的任何其他实例混合在一起,那么以下更简单的方法也可以工作:
abstract class BaseType {}
abstract class MixinTypeA implements BaseType {}
abstract class MixinTypeB<T extends MixinTypeA> implements BaseType {
Future<T> mixinMethod({bool argA = true,
bool argB = true,
bool argC = true}) => null;
}
abstract class BaseTypeA extends BaseType implements MixinTypeA {
// declares a constructor
BaseTypeA();
}
abstract class BaseTypeB extends BaseType implements MixinTypeB<TypeA>{
// declares a constructor
BaseTypeB();
}
abstract class TypeA extends BaseTypeA {}
class TypeB extends BaseTypeB with MixinTypeB<TypeA> {}