Есть ли способ добавить метод расширения stati c в класс непосредственно в Dart? - PullRequest
1 голос
/ 14 января 2020

Я прочитал в комментарии по схожему вопросу для C#, что методы расширения можно вызывать только из экземпляров. То же самое верно для Дартс? Я пытаюсь добавить геттер к классу Platform , который будет называться так. Platform.isDesktop. Однако это работает только при вызове экземпляра класса, т.е. Platform().isDesktop, даже если объявление метода экземпляра как stati c. Почему мы не можем добавить участников c?

Код:

extension on Platform {
  bool get isMobile => Platform.isAndroid || Platform.isIOS;
  bool get isDesktop => Platform.isWindows || Platform.isMacOS || Platform.isLinux;
}

Ответы [ 2 ]

6 голосов
/ 14 января 2020

Да, то же самое верно и для Дартса. Метод расширения действует как метод экземпляра, а не как метод stati c. В настоящее время нет способа добавить методы stati c в класс из-за пределов класса.

Вы можете объявить методы stati c в расширении, но они * stati c в само расширение (вы называете их с помощью ExtensionName.methodName()).

Существует обсуждение добавления методов расширения c в https://github.com/dart-lang/language/issues/723.

1 голос
/ 14 января 2020

Так же, как и C#, Dart не поддерживает элементы расширения stati c.

Причина в том, что члены расширения являются сахаром syntacti c для элементов stati c. Например, скажем, у вас есть следующее:

extension IntAdder on int {
  int add(int other) => this + other;
}

Если вы хотите вызвать этот метод расширения:

var a = 5;
var b = a.add(3);
// b = 8

Компилятор берет этот код и выполняет перевод в логи c, который фактически окажется в байт-коде:

var a = 5;
// Transformed into the static equivalent, where 
// "this" in the extension method becomes the value of a
var b = IntAdder.add(a, 3); 
// b = 8;

Фактически, скомпилированная форма самого расширения превращается во что-то похожее на следующее:

class IntAdder {
  static int add(int $this, int other) => $this + other;
}

Зная это, Как будет реализован метод расширения stati c, если метод расширения уже неявно установлен stati c? Метод «instance» легко перевести в метод stati c, но динамическая вставка элементов в сам тип в контексте stati c гораздо менее проста.

(Существует причина, по которой языки-прототипы, такие как Swift и Javascript, лучше в таких вещах, чем более объектно-ориентированные языки, такие как C# и Dart.)

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