Как аргументы передаются в список параметров ClassMirror.newInstance()?

Я написал следующий (рабочий) код и теперь хотел бы добавить параметр «октава» в вызов конструктора для подклассов животных, я думаю, чтобы при создании нового животного студия могла внести соответствующие коррективы. Или что-то. Это просто способ понять семантику языка Dart.

Идея (по общему признанию, глупая, но забавная, да?) заключается в том, что экземпляр AnimalStudio знает, какой тип Animal добавить к себе, исходя из того, что это за AnimalStudio. Таким образом, CatStudio автоматически добавляет Cat. AnimalStudio ничего не знает о CatStudio или Cat, поэтому он может быть частью общедоступного API, который расширяется «в дикой природе».

В каждой студии есть только одно животное, чтобы предотвратить обратную связь.

Там три файла: 1. animals.dart 2. model.dart 3. main.dart

файл: животные.dart

import "dart:mirrors";

abstract class AnimalStudio {
  Animal animal;
  final String animalType;

  String record() {
    print("$animalType: ${animal.sing()} in ${animal.octave}");
  }

  AnimalStudio(octave) {
    animal = new Animal(animalType, octave);
//    print("AnimalStudio::setup(): ${animal.toString()}: $animalType");
//    print("AnimalStudio::makeSound: " + animal.makeSound());
  }
}

/* Here's the magic factory.
 * To do:
 *  Get "cat", "dog", etc from mirror system.
 */
abstract class Animal {
  factory Animal(String type, String octave) {
    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)];
    InstanceMirror inst = cls.newInstance(new Symbol(''), [octave]);
    return inst.reflectee;
  }
}

class AnimalBase implements Animal {
  final String sound; // the sound she makes when she sings
  String sing() => sound;
  AnimalBase(this.sound);
}

файл: model.dart

library app.models;

import 'animals.dart';

class CatStudio extends AnimalStudio {
  final animalType = "Cat";
  CatStudio(octave) : super(octave);
}

class Cat extends AnimalBase {
  final String octave;
  Cat(this.octave) : super("Meow");
}

файл: main.dart

import "model.dart";

void main() {
  new CatStudio("C major").record();
}

person Tom Russell    schedule 06.11.2015    source источник
comment
Это тот же вопрос. Пожалуйста, улучшите другой вопрос, вместо того, чтобы задавать тот же вопрос снова. Пожалуйста, продемонстрируйте, чего именно вы хотите достичь, без отражения/зеркал, чтобы было ясно, чего вы хотите достичь. Делая это с зеркалами, нужно всего лишь сделать небольшой дополнительный шаг.   -  person Günter Zöchbauer    schedule 06.11.2015
comment
Извини за это. Но я не получаю ответа, который мог бы понять, поэтому, думаю, я буду продолжать спрашивать по-разному, пока кто-нибудь не поймет, к чему я клоню.   -  person Tom Russell    schedule 06.11.2015
comment
Это очень простой вопрос, который очень усложняется из-за большого количества шума и пропуска битов, необходимых для понимания того, как связаны части. Покажите полный код простого примера, позволяющего воспроизвести то, чего вы хотите добиться без отражения, а затем я покажу вам, как это сделать с отражением. Вы также можете создать DartPad dartpad.dartlang.org с полностью работающим кодом (опять же, нет необходимости использовать отражение/зеркала). все же). Тогда у нас есть хорошая отправная точка для обсуждения проблем, с которыми вы столкнулись. Тем не менее, пожалуйста, улучшите свой предыдущий вопрос.   -  person Günter Zöchbauer    schedule 06.11.2015
comment
Я отредактировал приведенный выше пример в рабочее состояние. Добавление класса AnimalBase позволяет добавить генеративный конструктор; в противном случае Cat должен напрямую реализовать Animal. Это означает, что нет Cat(arg) : super(arg). По крайней мере, это мое текущее понимание.   -  person Tom Russell    schedule 15.11.2015
comment
Дополнительные сведения о реализации абстрактного класса, содержащего фабрику, см. в обсуждении на странице stackoverflow.com/questions/33664975.   -  person Tom Russell    schedule 15.11.2015