首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ClassMirror.newInstance()的“参数”参数的格式是什么?

ClassMirror.newInstance()的“参数”参数的格式是什么?
EN

Stack Overflow用户
提问于 2015-11-05 09:46:32
回答 1查看 393关注 0票数 0

我非常愿意玩这个游戏,直到我正确的,但我希望有人能给我一个提示。参数在docs (gen-dartdocs/dart-mirrors/ClassMirror/newInstance.html)中声明为

代码语言:javascript
复制
InstanceMirror newInstance(Symbol constructorName,
                      List positionalArguments,
                      [Map<Symbol,dynamic> namedArguments]);

在文档中有关于positionalArguments和namedArguments格式的很好的文章。然而,这只是抽象的一面,我目前的容忍水平。

http://japhr.blogspot.com/2014/06/dart-factory-method-pattern.html也有一个不错的讨论,但是,遗憾的是,没有实际将args传递到方法中的例子。

在我的例子中,我想简单地将两个args,"title“和"description”传递给一个未命名的子类构造函数。

到目前为止,这是我的代码:

文件: item.dart

代码语言:javascript
复制
import 'dart:mirrors';

abstract class Item {

    String title;
    String description;

    factory Item(String type) {
      MirrorSystem libs = currentMirrorSystem();
      LibraryMirror lib = libs.findLibrary(new Symbol('app.models'));
      Map<Symbol, Mirror> classes = lib.declarations;
      // To do: handle exception if class not found
      ClassMirror cls = classes[new Symbol(type)];
      // TODO:
      //  verify each subclass has no-arg ctor
      //  determ how to pass args to ctor.
      InstanceMirror inst = cls.newInstance(new Symbol(''), []);
      return inst.reflectee;
    }

    // conflicts w/ Item factory
//  Item(this.title, this.description);
}

下面是实例化的类:

文件: model.dart

代码语言:javascript
复制
library app.models;

import 'item.dart' show Item;

/// The barebones model for a codelab. Defines constants used for validation.
class Codelab implements Item {
   // ...
}

最后,这里是如何调用项目工厂。ItemElement是它自己层次结构的超类,由CodelabElement子类:

档案: item_element.dart:

代码语言:javascript
复制
import 'item.dart' show Item;

class ItemElement {
    Item item;
    final String itemType;

    ItemElement() {
      item = new Item(itemType);
    }
    // ...
}

和CodelabElement:

文件: codelab_element.dart

代码语言:javascript
复制
import 'model.dart' show Codelab;
import 'item_element.dart' show ItemElement;

class CodelabElement extends ItemElement {

    final itemType = "Codelab";

    CodelabElement() : super() {}

    //...
}

然后:

文件: main.dart

代码语言:javascript
复制
void main() {
    var element = new CodelabElement();
}

目前,新的Codelab实例是从newInstance()返回的(非常酷),但是它不包含继承的'title‘和'description’吸引人。

也许是因为我不清楚“扩展”和“实现”的用法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-05 09:54:03

这应该能行

代码语言:javascript
复制
cls.newInstance(new Symbol(''), ['a', 1] /*, 
    {#arg1Name: 'arg1Value', #arg2Name: 'arg2Value'}*/ );

就像

代码语言:javascript
复制
new MyClass('a', 1, arg1Name: 'arg1Value' /*, arg2Name: 'arg2Value'*/); 

刚才看到的,命名的参数没有实现。

你可以在DartPad里试一试

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33541216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档