出于必要,我的代码相当复杂。我试图简化我正在处理的对象系统的总体布局,以(希望)使其更易于理解。
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
泛型扩展了实现MixinTypeB
的<MixinTypeA>
,所以MixinTypeB
接口(interface)用两个不同的(尽管与继承相关)接口(interface)实现了两次:TypeA
和MixinTypeA
。本质上,存在
T
泛型以使我的代码保持DRY。 MixinTypeB
中的方法示例是该类可能具有的特定类型签名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> {}