2013-05-10 1 views
3

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

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/, но не нашел именно что я хотел.

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

+0

Re: зеркала и dart2js. Мы намерены поддерживать зеркала с dart2js, и мы над этим работаем, но это еще не 100%. Будьте на связи! –

ответ

4

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

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

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

Также см What are some good workarounds for dart's lack of static typing semantics?