Как организовать данные в коллекции с подмножествами?
Мой проект использует Unity, поэтому я пишу на C#, но это проблема моделирования.
Мои классы моделей следуют этой схеме:
+---+ +---+
| A | | B |
+-^-+ +-^-+
| |
+----+---+ +----+---+
| | | |
+--+-+ +-+--+ ++---+ +----+
| A1 | | A2 | | B1 | | B2 |
+----+ +----+ +----+ +----+
А и Б абстрактны. Каждый экземпляр имеет уникальный идентификатор, и все они создаются в начале из файла json и не изменяются во время выполнения. Некоторые подклассы могут быть добавлены в любое время.
В глобальном объекте DAO у меня есть один словарь для каждого подкласса (A1, A2, B1 и B2).
Это нормально, когда мне нужно получить все экземпляры А1, например, или один конкретный экземпляр этого типа.
Но в моей программе мне нужно уметь:
- Получить все экземпляры из одного подкласса (A1, A2..). Тип возвращаемого значения должен быть списком этого подкласса.
- Получить один экземпляр из одного подкласса с его идентификатором. Тип возвращаемого значения должен быть этим подклассом.
- Получить все экземпляры A (A1, A2 и все классы, которые наследуют A, которые могут быть добавлены в будущем). Тип возврата должен быть Список А.
- Получить один экземпляр от А с его идентификатором. Тип возврата должен быть A.
- Все то же самое с деревом B.
Моя проблема связана с принципом Open/Close. Если мне нужно добавить несколько подклассов в A, мне нужно создать новый словарь в моем DAO, создать метод, чтобы найти этот конкретный подкласс, и изменить метод, чтобы найти все подклассы A. Так что это не хорошо.
Более того, если я сосредоточусь на методе, который позволяет мне находить один экземпляр A по идентификатору, мне нужно будет просмотреть все словари подклассов A, и я чувствую, что должен найти его немедленно, потому что у меня есть его идентификатор.
Я думал, что смогу создать словарь только для суперклассов, поэтому я мог бы найти каждый идентификатор напрямую, но если мне нужно найти все экземпляры одного конкретного подкласса, мне придется пройти через весь этот словарь, чтобы отфильтровать их, и, как это возможно, не меняются во время выполнения, я также чувствую, что я трачу ресурсы. Кроме того, я не смогу получить реальный класс экземпляров без уныния, и это кажется грязным.
Проблема довольно проста, но, на мой взгляд, ее очень сложно объяснить, я надеюсь, что она достаточно ясна. Я бегаю кругами, когда пытаюсь найти рабочее решение, которое также уважает принципы Мартина.