Можно ли создать экземпляр класса из динамической переменной?

У меня есть много объектов одного и того же базового типа. Я хочу создать общую функцию для их создания. Пример кода:

class Grid extends Display { ....
class Start extends Display { ....

class MainClass {
  Grid grid;
  Start start;
  ....
}

в методе MainClass вместо этого:

start = new Start();
start.load(PATH);

grid = new Grid();
grid.load(PATH);

.... 

Я хотел бы сделать что-то вроде этого:

void _newDisplay(dynamicType, Display display) {
  display = new dynamicType();
  display.load(PATH);        
}

_newDisplay(Start, start);
_newDisplay(Grid, grid);

....

Я прочитал http://www.dartlang.org/articles/Optional-Types/ но не нашел именно то что хотел.

Я также нашел Создание экземпляра класса из строки, но есть комментарий, говорящий : «Примечание: это может не работать при компиляции в JavaScript. Компилятор dart2js еще не полностью поддерживает зеркала». Является ли это «зеркальное» решение единственным доступным для динамического создания экземпляров?


person Eric Lavoie    schedule 10.05.2013    source источник
comment
Re: зеркала и dart2js. Мы намерены поддерживать зеркала с помощью dart2js, и мы работаем над этим, но еще не на 100%. Быть в курсе!   -  person Seth Ladd    schedule 11.05.2013


Ответы (1)


Dart не поддерживает прямой способ сделать это. Обычно мы обходим это, предоставляя замыкание, которое создает для нас экземпляр типа:

void _newDisplay(dynamicType, Display display) {
  display = dynamicType();
  display.load(PATH);        
}

_newDisplay(() => Start(), start);
_newDisplay(() => Grid(), grid);

Также см. какие хорошие обходные пути для отсутствия семантики статической типизации в dart?

person Florian Loitsch    schedule 10.05.2013