По сути, я пытаюсь создать общий интерфейс симулятора, который действует как потерянная связь между моделью и пользовательским интерфейсом, который выступает в качестве представления. Мой интерфейс симулятора выглядит так:
type ISimulator<'Collection, 'Item, 'Value> =
inherit System.IObservable<'Collection>
inherit System.IObservable<ISimulator<'Collection, 'Item, 'Value>>
abstract Start: unit -> unit
abstract Stop: unit -> unit
abstract Reset: unit -> unit
abstract Reset: 'Collection -> unit
abstract Advance: int<gen> -> unit
abstract InitialState: 'Collection
with get
abstract CurrentState: 'Collection
with get
abstract Rule: ('Item -> 'Value)
with get, set
abstract Generation: int<gen>
with get, set
abstract Speed: float<gen/sec>
with get, set
abstract Running: bool
with get
'Коллекции - это тип сбора данных,' Элемент - это тип отдельного элемента данных, а 'Значение - это тип его фактического значения (например, , и т. д.). Теперь линия
inherit System.IObservable<ISimulator<'Collection, 'Item, 'Value>>
выдает ошибку:
This type implements or inherits the same interface at different generic instantiations 'System.IObservable<Interface.ISimulator<'Collection,'Item,'Value>>' and 'System.IObservable<'Collection>'. This is not permitted in this version of F#.
По сути, я хочу, чтобы этот интерфейс говорил, что и Коллекция, которая служит данными, на которых выполняется симуляция, и сам Симулятор должны наблюдаться отдельно. В конце я хочу, чтобы часть моего пользовательского интерфейса отображала текущие данные (например, матрицу), а другая часть - для отображения и управления симулятором, с некоторыми кнопками, такими как «Run», «Stop», «Reset» и т. Д. Поскольку симулятор также может быть остановлен другими способами, кроме простого нажатия кнопки (например, после достижения какого-то определенного состояния, генерации и т. Д.), Этот элемент управления также нуждается в обновлениях из симулятора, но не в отношении состояния данных, но сам симулятор.
Невозможно сделать интерфейс коллекции, который я бы написал, наблюдаемым, поскольку эта коллекция не будет изменена во время моделирования, но будет преобразована с помощью функции, и преобразование создаст новую коллекцию, которую затем сохранит симулятор ( и уведомляет наблюдателей о сборе).
Что мне делать?
- нарушить концепцию неизменности и
всегда держите одну и ту же коллекцию (в
условия идентичности, не содержащиеся
значения), который просто меняется с течением времени
вместо производства новых, модифицированных
коллекции?
- Разорвать связь и получить мой пользователь
интерфейс знает точное
реализация, которая будет вне
интерфейса, предоставьте второй
значит наблюдать за симулятором
сам? Есть весь пользовательский интерфейс
компоненты, которые требуют обновления от
симулятор наблюдать за всем
вещь, а не только соответствующие данные?
- Создать отдельный интерфейс для
наблюдать за коллекцией и иметь мой
реализация реализации симулятора
оба интерфейса?
- Что-то еще?