2015-11-05 1 views
0

Я совершенно согласен играть с этим, пока не понял, но надеялся, что кто-то может дать мне подсказку. Параметр объявлен в документации (генераторных dartdocs/дротик-зеркало/ClassMirror/newInstance.html), какКаков формат параметра «аргументы» для ClassMirror.newInstance()?

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

Существует хорошая рецензия на формате positionalArguments и namedArguments в документации. Тем не менее, это немного на абстрактной стороне моего текущего уровня толерантности.

Достаточное обсуждение также существует в http://japhr.blogspot.com/2014/06/dart-factory-method-pattern.html Но, увы, нет примеров фактического прохождения аргументов в метод.

В моем случае я хотел бы просто передать два аргумента «title» и «description» в конструктор неназванного подкласса.

Вот мой код до сих пор:

файл: 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 { 
    // ... 
} 

Наконец, вот как называется фабрика предметов. 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'.

Возможно, это имеет какое-то отношение к тому, что я неясен в использовании «расширений» и «орудий».

+0

Что вы имеете в виду под «конструкторе подкласса». Можете ли вы добавить объявление класса с помощью конструктора, который вы хотите вызвать? –

+0

Я включил довольно полный пример для всех заинтересованных. Все еще обертываю вокруг себя концепции ... –

+0

Я просто не могу понять, чего вы хотите достичь. Похоже, проблема заключается не в зеркале, а в создании объектов вообще. Я понятия не имею, какую роль играют классы 'ItemElement' и' CodelabElement'. Какую строку вы фактически передали бы как 'type' в' new Item() '? –

ответ

1

Это должно работать

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

и как

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

Просто увидел, именованные аргументы не реализованы.

Вы можете попробовать его в DartPad

+0

Я использую WebStorm. Выполнение вышеуказанных результатов приводит к следующей ошибке: Необработанное исключение: Нет конструктора «MyClass». с соответствующими аргументами, объявленными в классе Codelab. NoSuchMethodError: неправильное количество аргументов, переданных методу 'MyClass.' Receiver: Type: class 'MyClass' Пробный вызов: MyClass. ("Arg1", "arg2") –

+0

Похоже, что Dart пытается составить вызов именованного конструктора с отсутствующим именем, не так ли? –

+0

Ах, радости от игры с новым языком и оставление висячего на сухом ... –