В Scala я пытаюсь создать следующую вещь.
У меня есть иерархия Config
объектов. У меня сейчас около 10 различных подклассов Config
, и это число будет расти.
Я хочу создать интерфейс Storage
двумя способами: add(c: Config): Unit
и get(name: String): Config
, чтобы иметь возможность добавлять / извлекать Config
объекты в базовое хранилище (дБ, файл, набор в памяти и т. Д.). ).
Каждый ConfigImpl
объект должен храниться по-своему: например, ConfigImplA
объекты будут храниться в StorageImplA
, ConfigImplB
в StorageImplB
и т. Д.
Обычно каждый подтип ConfigImpl
имеет свой собственный StorageImpl
, который не зависит от других.
Наконец, я хочу создать класс MultiStorage extends Storage
компонента верхнего уровня, который внутри содержит List[_ <: Storage]
(с каждым хранилищем, содержащим объекты одного типа).
get
из MultiStorage
будет пытаться извлечь Config
из каждого хранилища в списке по порядку, в то время как add
зарегистрирует новый c: Config
в хранилище, 'хранящем' объект того же (sub) тип c
:
List[_ <: Storage] storages = List(storageA, storageB, storageC, ...) \\ this is externally configured
def add(c: Config) = storages.find(s => typeOf[s] == typeOf[c]).get.add(c)
Как я объяснил здесь ( Невозможно получить тип универсального объекта в списке ) У меня проблемы с управлением типами в такой ситуации. Я хотел бы понять, не является ли общий дизайн этой вещи не идеальным, и я должен подходить к этому по-другому или есть способ правильно поиграть с типами, чтобы реализовать чистое решение этой проблемы.