2013-02-05 49 views
0

因此,我研究了鏡像,他們可能是一種選擇,但考慮到它們的異步特性,它們可能非常難以使用或長期不可行。由於目前還不支持(只是玩遊戲),無論如何它們在這個時候並不是真正可行的。在飛鏢中動態加載課程

問題:給定一系列字符串,例如: [ "Foo", "Bar" ]基類Applicationlibrary corelib;Widget和每個字符串FooWidget的相應的類,BarWidgetlibrary applibrary;,什麼是目前最優雅的方法來獲取Application把字符串到相應的類的實例,與dart2js工作。

等效PHP僞例如爲清楚起見,

<?php # example 

namespace corelib; 

class Widget { 
    function name() { 
     return \get_called_class(); 
    } 
} 

class Application { 
    static function resolve($name, $library) { 
     $class = $library.'\\'.$name.'Widget'; 
     return new $class; 
    } 
} 

namespace applibrary; 

class FooWidget extends \corelib\Widget { 
    // ... 
} 

class BarWidget extends \corelib\Widget { 
    // ... 
} 

$foowidget = \corelib\Application::resolve('Foo', 'applibrary'); 
$barwidget = \corelib\Application::resolve('Bar', 'applibrary'); 

echo "{$foowidget->name()} <br> {$barwidget->name()}"; 

輸出

applibrary\FooWidget 
applibrary\BarWidget 

回答

1

如果你可以驗證字符串,那麼目前最好的辦法(名單直到dart2js鏡的支持變得更好的烘烤),可能是一個if聲明。

// toy implementation 
Widget getWidget(name) { 
    switch (name) { 
    case "Foo": return new FooWidget(); 
    case "Bar": return new FooWidget(); 
    default: // handle error 
    } 
} 

// elsewhere: 
var fooWidget = getWidget("Foo"); 
var barWidget = getWidget("Bar"); 

xyzWidget類的列表將是有限的名單(因爲你不能在代碼中動態運行時反正鏈接)。

當然,一個更優雅的做法是利用鏡子(如下圖所示,以供參考,但它目前並不符合dar2js標準)

Future<Widget> getWidget(library, name) { 
    var completer = new Completer<Widget>(); 
    MirrorSystem ms = currentMirrorSystem(); 
    ClassMirror cm = ms.libraries[library].classes[name]; 
    // instantiate an instance of the class 
    cm.newInstance(null,[]).then((instance) => completer.complete(instance)); 

    return completer.future; 
} 

// elsewhere: 
getWidget("applibrary","FooWidget").then((Widget widget) { 
    // do something with widget 
}); 
+0

擔心,這可能是唯一的出路。我現在實際上使用了一個類似的解決方案(作爲一個停止差距措施),而不是一個開關/函數,我將一個Map 傳遞給核心庫中的Environment類,執行'widgetresolver'(這是一個簡單的函數'typedef'),每次給我一個實例。 在鏡子的例子是有辦法使未來同步?整個未來對我來說沒有任何幫助,因爲我不得不讓所有的小部件都等待,以便能夠相互進行交叉計算。 – srcspider

+0

我喜歡你的解決方案的widgetresolver。這比switch語句更優雅:)。關於讓應用程序等待,無論如何你肯定需要這樣做:FooWidget和BarWidget都需要實例化,然後才能對彼此進行計算。 –

+1

事情是這樣的,因爲我只是實例化一個班級,我不覺得在考慮期貨(在整個應用程序中)浪費的時間有什麼價值。我只想要一個正確類的裸骨頭實例;如果我必須在實例化它之後手動初始化它,那很好。類似於我如何描述現在從「環境」類中獲取實例的類,可以避免大量潛在的複雜邏輯,這種方法可以讓'Widget'類的工廠直接傳遞給我一個實例。這是令人感興趣的,因爲我希望示例中的僞「corelib」是可重用的代碼。 – srcspider