Как специализировать (переопределять) поля класса в Dart?

Я хотел бы специализировать поля (переопределить), когда class расширен или реализован в Dart 2.

Смотрите код:

abstract class Abase {
  String id;
  List<Bbase> bbases;
}

abstract class Bbase {
  String id;
}

class A implements Abase {
  String id;
  String name;

  List<B> bbases; // 'A.bbases=' ('(List<B>) → void') isn't a valid override of 'Abase.bbases=' ('(List<Bbase>) → void').
}

class B implements Bbase {
  String id;
}

class Abase имеет общее поле List<Bbase> bbase, а в class A я хотел бы выделить это поле с помощью List<B> bbase.

Но это невозможно. Эта ошибка отображается на analyzer или build_runner:

'A.bbases =' ('(Список) → void') не является допустимой заменой 'Abase.bbases =' ('(Список) → void').

  1. Есть ли причина, по которой не принимает эту специализацию полей?
  2. Есть ли другой способ специализации полей на extends или implements?

person Muka    schedule 30.10.2018    source источник
comment
Вы можете использовать дженерики, но я считаю ваш код слишком запутанным, чтобы реализовать его на практике. что-то вроде abstract class Abase<T> { String id; List<T> bbases; } и class A implements Abase<Bbase> {   -  person Günter Zöchbauer    schedule 30.10.2018
comment
Дженерики - это путь. Большой!   -  person Muka    schedule 30.10.2018


Ответы (1)


Вы должны использовать дженерики:

abstract class Abase<T extends Bbase> {
  String id;
  List<T> bbases;
}

abstract class Bbase {
  String id;
}

class A implements Abase<B> {
  String id;
  String name;

  List<B> bbases;
}

class B implements Bbase {
  String id;
}
person Alexandre Ardhuin    schedule 30.10.2018
comment
Отлично, вот что я искал. - person Muka; 30.10.2018