Dart: расширяет общий класс с ограничениями

Это правильный способ объявить «общий класс», который расширяет другой «общий класс» в дротике? Обратите внимание, что общий параметр имеет ограничение по типу.

// available types
class BaseType {}
class DerivedType extends BaseType {}

class BaseClass<Type extends BaseType> {
  final Type prop;
  BaseClass(this.prop) {
    // can be either BaseType or DerivedType
    print(prop);
  }
}

class DerivedClass<Type extends BaseType> extends BaseClass<BaseType> {
  DerivedClass(BaseType prop) : super(prop);
}

Приведенный выше код работает, но я не уверен, что использую правильный синтаксис.


person Cequiel    schedule 14.06.2016    source источник


Ответы (1)


Хотя ваш код правильный, я думаю, вы допустили семантическую ошибку в общем DerivedClass:

// available types
class BaseType {}
class DerivedType extends BaseType {}

class BaseClass<T extends BaseType> {
  final T prop;
  BaseClass(this.prop) {
    // can be either BaseType or DerivedType
    print(prop);
  }
}

class DerivedClass<T extends BaseType> extends BaseClass<T /*not BaseType*/> {
  DerivedClass(T /*not BaseType*/ prop) : super(prop);
}
person Alexandre Ardhuin    schedule 14.06.2016
comment
Это то, что я, хотя, но когда я пишу ваш код, я получаю предупреждение о неявном приведении Unsound из BaseType в Type. - person Cequiel; 15.06.2016
comment
Ты прав. Код был немного сложным, и я был немного сбит с толку. - person Cequiel; 15.06.2016
comment
Этот ответ - единственное место, которое я нашел во всем Интернете, которое устанавливает этот синтаксис BaseClass<T>. Большое спасибо @Alexandre Ardhuin - вы положили конец моим выходным, когда я выдергивал волосы из-за несоответствия универсальных типов! - person Craig Labenz; 04.02.2019