【问题标题】:What is the format of the "arguments" parameter to ClassMirror.newInstance()?ClassMirror.newInstance() 的“arguments”参数的格式是什么?
【发布时间】:2015-11-05 09:46:32
【问题描述】:

在我做对之前,我非常愿意玩这个,但希望有人能给我一个提示。该参数在文档 (gen-dartdocs/dart-mirrors/ClassMirror/newInstance.html) 中声明为

InstanceMirror newInstance(Symbol constructorName,
                      List positionalArguments,
                      [Map<Symbol,dynamic> namedArguments]);

在文档中有一篇关于 positionalArguments 和 namedArguments 格式的很好的文章。但是,这只是我目前的容忍度的抽象方面。

一个体面的讨论也存在于 http://japhr.blogspot.com/2014/06/dart-factory-method-pattern.html 但是,唉,实际上没有将 args 传递给方法的示例。

在我的例子中,我想简单地将两个参数“标题”和“描述”传递给一个未命名的子类构造函数。

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

文件:item.dart

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

library app.models;

import 'item.dart' show Item;

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

最后,这里是 Item factory 的调用方式。 ItemElement 是其自身层次结构的超类,由 CodelabElement 子类化:

文件:item_element.dart:

import 'item.dart' show Item;

class ItemElement {
    Item item;
    final String itemType;

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

和 CodelabElement:

文件:codelab_element.dart

import 'model.dart' show Codelab;
import 'item_element.dart' show ItemElement;

class CodelabElement extends ItemElement {

    final itemType = "Codelab";

    CodelabElement() : super() {}

    //...
}

然后:

文件:main.dart

void main() {
    var element = new CodelabElement();
}

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

也许这与我不清楚“扩展”和“实现”的用法有关。

【问题讨论】:

  • “子类构造函数”是什么意思。能否请您在要调用的构造函数中添加类的声明?
  • 我为感兴趣的人提供了一个相当完整的示例。仍在思考这些概念......
  • 我只是无法弄清楚你想要完成什么。看起来问题主要不是关于反射/镜像,而是关于一般的对象实例化。我不知道ItemElementCodelabElement 类应该扮演什么角色。您实际上会将什么字符串作为type 传递给new Item()
  • 如果您熟悉 [github.com/dart-lang/polymer-and-dart-codelab] 上的“Polymer 和 Dart Codelab”示例,您会看到我刚刚删除了 Polymer 内容并将 Codelab* 类的代码移动到相应的项目中* 课程。我将再次发布这个问题,但有另一个例子。

标签: dart factory dart-mirrors


【解决方案1】:

这应该可行

cls.newInstance(new Symbol(''), ['a', 1] /*, 
    {#arg1Name: 'arg1Value', #arg2Name: 'arg2Value'}*/ );

就像

new MyClass('a', 1, arg1Name: 'arg1Value' /*, arg2Name: 'arg2Value'*/); 

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

你可以在DartPad试试

【讨论】:

  • 我正在使用 WebStorm。执行上述操作会导致以下错误:未处理的异常:没有构造函数“MyClass。”具有在类“Codelab”中声明的匹配参数。 NoSuchMethodError:传递给名为“MyClass”的方法的参数数量不正确。接收方:类型:类 'MyClass' 尝试调用:MyClass.("arg1", "arg2")
  • 看起来 Dart 正在尝试编写一个对缺少名称的命名构造函数的调用,不是吗?
  • 您的问题是关于镜像等高级主题,但您的问题似乎是理解类、构造函数和继承。你的问题没有显示你试图完成什么。我什至不知道从哪里开始跟进问题以找出问题所在。
  • 确实如此。我会尝试提出一个更好的例子。如果您可以仅对错误消息及其包含“。”的原因有所了解,这可能会有所帮助。在“MyClass.('arg1', 'arg2')”中。
  • 我不认为这个. 是相关的。当错误消息的字符串是为命名(使用.)或未命名(没有)构造函数构造时,可能只是一个疏忽。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2016-02-17
  • 2015-01-21
  • 2013-07-13
相关资源
最近更新 更多