Metaobjects в Dart: виртуальные статические и конструкторы

Я — MADTeacher, автор книг по Dart/Flutter/ИИ в программировании и преподаватель. На канале разбираю свежие фичи языка и фреймворка, объясняю, как и когда их применять, и показываю всё на живых примерах кода. Меньше воды — больше практики: от конструкторов и метапрограммирования до производительности, интеропа и тестирования, а также поднимаю тему использования ИИ для разработки программных продуктов. Если хотите понимать Dart и Flutter в эпоху ИИ глубже — вы по адресу.

Dartmetaobjectsстатические члены

Замечен черновик новой фичи - Metaobjects 😎

Этот механизм позволит отображать тип (например, класс) в специальный метаобъект, отвечающий за «виртуальные» статические члены и конструкторы данного типа.

Основные моменты фичи:

  • 🔧 Виртуальные статические члены. Сейчас в Dart для вызова статических методов нужно явно указывать имя конкретного класса (например, Foo.foo()). С метаобъектами можно вызывать статические методы через переменную типа, даже если тип известен только во время выполнения.
  • • 🏗 Виртуальные конструкторы. С помощью метаобъектов можно будет создавать объекты (вызывать конструкторы) через абстрактные типовые переменные.
  • •✅ Изменения в синтаксисе и статическая гарантия типов. Новая пара ключевых конструкций static implements и static extends позволит компилятору гарантировать, что метаобъект будет иметь необходимый интерфейс для вызова соответствующих статических членов или конструкторов.
  • 🤖 Имплицитно генерируемые классы. Для каждого класса, где при его объявлении используются static implements или static extends компилятор автоматически сгенерирует скрытый метаобъект-класс, который переадресует вызовы к статическим методам или конструкторам исходного класса.

В целом, данная фича расширяет возможности языка, делая статические члены и конструкторы «виртуальными». Благодаря этому нововведению их можно будет вызывать не напрямую через конкретное имя класса, а через абстрактное представление типа. Другими словами, вы сможете писать более гибкий обобщенный и типобезопасный код 🔫

Ниже приведен пример кода с использованием текущей фичи:

// Интерфейс, описывающий «виртуальный» статический метод.
abstract class Fooable<X> {
  const Fooable();
  String foo(X x);
}

// Класс A теперь объявлен с ключевым словом static implements,
// что позволяет генерировать метаобъект, переадресующий вызовы.
class A static implements Fooable<A> {
  final String name;
  A(this.name);

  // Статический метод, к которому будет осуществляться вызов через метаобъект.
  static String foo(A a) => "${a.name} fooing!";
}

// Функция, использующая метаобъект: тип X (ограниченный интерфейсом Fooable<X>)
// «виртуализирует» вызов статического метода.
String showFoo<X static extends Fooable<X>>(X x) {
  return X.foo(x);
}

void main() {
  // Теперь можно вызывать статический метод через типовую переменную X,
  // что делает код более обобщённым.
  print(showFoo(A("MyA")));
}

Как по мне – данная фича чем-то напоминает виртуальную таблицу из С++ 🤣

Ждете?
👍 – О, да, детка!!!
👌 - сомнительно, но Окей
👎 - не вижу от него пользы

#dart_lang@madteacher_channel

Дискуссия

Boltology Tech | Nikita Sinyavin
Вспоминаются слова Егорова Попова на Flutter Conf: "не надо делать из Dart плюсы" 😁
Deleted Account
Здорово! Очень интересно следить за нововведениями!
Eugene Voyner
Boltology Tech | Nikita Sinyavin
Вспоминаются слова Егорова Попова на Flutter Conf: "не надо делать из Dart плюсы" 😁
Скорее сделают, чем нет
Zeev Belkin
Статический метод можно вызывать не создавая экземпляра, а здесь нельзя? В базовом классе метод определён как обычный. Вообще, каким образом компилятор знает, обрабатывая определение showFoo, что метод foo можно вызывать типа как статический? Если static extend, то все методы типа как статические можно вызывать? А если в showFoo написать (X? x) и потом её как showFoo((A)null) вызвать, работать будет? (IMHO, нет) Какой-то извращённый Syntax sugar получается.
Иван Каршакевич
Что-то в последнее время они много черновиков делают. Будет интересно, если они не кинут эти идеи в долгий ящик
пикабу
жду скетчи еще как прошлый балмура!!!
Присоединиться к обсуждению →

Читайте так же