0

それで、私はミラーを調べました、そしてそれらはオプションかもしれません、しかしそれらの非同期性を考えると、それらは本当に使いにくいか、あるいは単に長期的には実行可能ではないかもしれません。それらは現在サポートされていないので(単なる遊び道具)、とにかく現時点では実際には実行可能ではありません。

質問:一連の文字列が与えられた場合、たとえば。[ "Foo", "Bar" ]基本クラスApplicationWidgetin、library corelib;および各文字列の対応するクラスFooWidgetBarWidgetinは、文字列を対応するクラスのインスタンスに変換するlibrary applibrary;ための現在最も洗練されたメソッドであり、dart2jsで機能しますApplication

明確にするための同等の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
4

1 に答える 1

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
});
于 2013-02-05T10:25:24.427 に答える