Замечен черновик новой фичи - 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


Дискуссия