Мой код довольно запутан по необходимости. Я попытался упростить общую компоновку системы объектов, над которой я работаю, чтобы (надеюсь) сделать ее более понятной.
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
реализуется дважды с двумя разными (хотя и связанными по наследству) интерфейсами: TypeA
и MixinTypeA
.
По сути, универсальный T
существует для того, чтобы мой код оставался СУХИМ. Пример метода в MixinTypeB
— это один из различных потенциальных методов, которые может иметь класс с определенной сигнатурой типа T
. Я не знаю, как обойти новое ограничение без ущерба для структуры наследования этой системы типов.