Как определить интерфейс в объекте, который был назначен переменной базового класса в Dart? - PullRequest
0 голосов
/ 14 января 2019

Рассмотрим иерархию классов примерно так:

  • Существует один базовый класс, BaseClass
  • Существует множество производных классов от BaseClass, некоторые из которых реализуют различные интерфейсы

Так, например, есть класс DerivedClass, который расширяет BaseClass и реализует SomeInterface.

Поскольку я имею дело со многими различными классами, которые все наследуются от BaseClass, я решил, что буду хранить их объекты в контейнере, подобном List<BaseClass>. Но тогда я не могу найти способ обнаружить интерфейс в этих объектах.

class SomeInterface {
  String field;
}

abstract class BaseClass {
  int count;

  BaseClass(this.count);
}

class DerivedClass extends BaseClass implements SomeInterface {
  String field;

  DerivedClass(int count, this.field) : super(count);
}

void printField(SomeInterface obj) {
  print(obj.field);
}

void main() {
  BaseClass item = DerivedClass(4, 'test');
  if (item is SomeInterface) {  // Attempt one
    print(item.field);
  }
  printField(item);  // Attempt two
}

Раньше у меня было SomeInterface в цепочке наследования, как у фактического суперкласса, но я бы хотел избежать этого, так как интерфейсы легче обрабатывать в моем случае. Что бы вы порекомендовали?

1 Ответ

0 голосов
/ 14 января 2019

is работает для реализованных интерфейсов так же, как и для суперклассов.

Итак

if (item is SomeInterface) {

- это путь.

Как @attdona указал ниже, чтобы получить доступ к SomeInterface членам после проверки is, все еще необходимо использовать приведение.

Смотри также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...