Я совершенно согласен играть с этим, пока не понял, но надеялся, что кто-то может дать мне подсказку. Параметр объявлен в документации (генераторных 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'.
Возможно, это имеет какое-то отношение к тому, что я неясен в использовании «расширений» и «орудий».
Что вы имеете в виду под «конструкторе подкласса». Можете ли вы добавить объявление класса с помощью конструктора, который вы хотите вызвать? –
Я включил довольно полный пример для всех заинтересованных. Все еще обертываю вокруг себя концепции ... –
Я просто не могу понять, чего вы хотите достичь. Похоже, проблема заключается не в зеркале, а в создании объектов вообще. Я понятия не имею, какую роль играют классы 'ItemElement' и' CodelabElement'. Какую строку вы фактически передали бы как 'type' в' new Item() '? –