Перекрестная ссылка на несколько объектов - PullRequest
0 голосов
/ 26 января 2009

Хорошо, так что мне трудно найти «хороший» способ сделать следующее:

Сгруппируйте объекты 4 так, чтобы, если я Объект A, я мог легко и без необходимости проходить Объекты B и C, чтобы выяснить, относится ли Объект D к Объекту А. Как и к любой другой комбинации ссылок.

В настоящее время я использую SortedLists, чтобы связать A с B и B с C и C с D, и делаю действительно неряшливую работу перекрестных ссылок на них. Это работает, но это действительно, очень уродливо. Мне не нравится ужасный код, если нет другого способа сделать это.

Я думаю об использовании класса для хранения объектов. Но как лучше всего ссылаться на них?

Заранее спасибо


Дополнительная информация:

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

Мне нужен способ легко ссылаться на них, не вызывая Setting4ControlB.Checked или Setting2ControlD.text, таким образом, связанные списки. Я использую общие события для определенных элементов управления для повторного использования кода, они все делают то же самое, за исключением того, что они ссылаются на разные объекты.

Во-первых, уродливая часть, устанавливающая ссылки, а во-вторых, делающая ссылки от A до D или от C до A и т. Д. Я хотел иметь возможность сделать что-то вроде этого:

GetSettingControls (ReferencingControl) .ControlA.Checked

ReferencingControl будет отправителем в событии, ControlA - это элемент управления, связанный с ReferencingControl.

Ответы [ 4 ]

2 голосов
/ 26 января 2009

Прежде всего, если у вас есть такие отношения, как A-> B-> C-> D, единственный способ увидеть, относится ли A к D, - пройти весь путь от A до D. Тем не менее, вы можете применить несколько фокусы

Это потребует ручного отслеживания каждой косвенной ссылки, присутствующей в программе, то есть вы будете отвечать за динамическое добавление ссылки A-> D, что может быть полезно для определенных логик, таких как, например, возможность "нести" предметы в игре.

Вам нужно использовать словарь WeakReferences, чтобы вы не поддерживали объекты через ссылки ...

public class MyObject
{
  public List<WeakReference> References = new List<WeakReference>();

  // My Class Properties and Methods
}

MyObject obj = new MyObject();
obj.refence.Add(new WeakReference(gun));

таким образом, если пистолет очищается от пула объектов (например, коллекция userObjects из вашей коллекции Level.Objects), слабая ссылка станет недействительной.

Вы можете проверить объект, выполнив

foreach ref in obj.references
  if (ref.IsAlive)
    object tool = ref.Target;

Это всего лишь пример, вы знаете, реализуете хорошие методы доступа, свойства и так далее ...

1 голос
/ 26 января 2009

Вы можете использовать универсальный класс Dictionary для указания пар ключ / значение между объектами.

Это позволит вам искать объект на основе другого объекта.

System.Collections.Generic.Dictionary<object, object> myDictionary = new Dictionary<object, object>();
myDictionary.Add(objectA, objectD);
myDictionary.Add(objectD, objectA);
0 голосов
/ 26 января 2009

В зависимости от вида отношения, которое вы пытаетесь представить, может быть действительно хорошая реализация / алгоритм. Например, если отношение определяет эквивалентные классы, вы можете использовать что-то вроде Алгоритм поиска объединения , чтобы определить, принадлежат ли два элемента одному и тому же классу.

0 голосов
/ 26 января 2009

Не думаю, что , а не рекомендуется проходить через объекты B и C. Ваши объекты должны знать только о его прямых связях, а затем оттуда вы можете обрабатывать отношения на основе всего графа объектов. .

Вы должны легко найти алгоритмы для базовой обработки графов.

Чего я не понимаю, так это того, почему вы используете SortedList. Сохраняются ли внешние связи с объектом?

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

...