Как мне организовать коллекцию классов - PullRequest
0 голосов
/ 22 марта 2011

У меня есть ряд объектов, с каждым из которых связаны метаданные. В типичном случае у меня есть класс, представляющий Object и Meta_Data, и я могу сделать Meta_Data атрибутом Object.

+---------------+    +---------------+
|    Object     |--->|   Meta_Data   |
+---------------+    +---------------+

Проблема возникает, когда я хочу создать коллекцию Объектов, каждый из которых связан с определенным экземпляром Meta_Data.

Метаданные должны иметь доступ к своим соседям:

a[0] = Object();
a[1] = Object();

// a[0].meta needs to be able to interact with a[1].meta
a[0].meta = Meta_Data();
a[1].meta = Meta_Data();

Если я просто создаю коллекцию объектов (с экземплярами Meta_Data в качестве атрибутов), то экземпляры Meta_Data изолируются и могут взаимодействовать только при прохождении через первичный объект. Это кажется не идеальным.

Единственная реальная альтернатива, о которой я могу подумать, - это создать некоторый контейнерный класс, который позволит мне иметь:

  1. Атрибут ObjectStack, который содержит коллекцию экземпляров Object
  2. Атрибут Meta_DataStack, содержащий коллекцию экземпляров Meta_Data
  3. Какой-то интерфейс, который синхронизирует два, так что я могу запросить соответствующие метаданные для любого конкретного экземпляра объекта.

Это снова кажется неэффективным. Итак, каков наилучший способ иметь коллекции объектов, которые можно связать поэлементно?

1 Ответ

2 голосов
/ 24 марта 2011

То, что у вас есть, выглядит примерно так:

[Object]--->[MetaData]<--+
                |        |
                +--------+

Что-то должно отвечать за соединение объектов MetaData, и это не может быть какой-то один объект Object.Вам нужен какой-нибудь Фабрика или Строитель, который бы все правильно собирал.

Это не значит, что Фабрике нужно поддерживать ссылку на каждый экземпляр обоих существующих классов, просто нужно установить соединения.

Object a = new Object();
Object b = new Object();
MetaData ma = new MetaData();
MetaData mb = new MetaData();

ma.setFriend(mb);
a.setMetaData(ma);
b.setMetaData(mb);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...