Я написал следующий (рабочий) код и теперь хотел бы добавить параметр «октава» в вызов конструктора для подклассов животных, я думаю, чтобы при создании нового животного студия могла внести соответствующие коррективы. Или что-то. Это просто способ понять семантику языка 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();
}