Вы можете упростить задачу, переместив «объектную ассоциацию» в выделенный класс. Вот что я имею в виду.
Определить класс с именем AssociationTable. Этот класс будет вести список пар, где каждая пара содержит ссылку на объект A и ссылку на объект B.
Каждый объект A (и каждый объект B) будет содержать ссылку на объект AssociationTable.
A.Add (B) будет реализован как table.add (this, b);
B.Add (A) будет реализован как table.add (a, this);
Удаление будет реализовано как table.delete (this, b) или table.delete (a, this)
class Pair {
A a; B b;
Pair(A a, B b) { this.a = a; this.b = b; }
// Also override Equals(), HashCode()
}
class AssociationTalbe {
Set<Pair> pairs = ...;
void add(A a, B b) { pairs.add(new Pair(a, b)); }
void remove(A a, B b) { pairs.remove(new Pair(a, b)); }
}
class A {
AssociationTable table;
public A(AssociationTable t) { table = t; }
void add(B b) { table.add(this, b); }
void remove(B b) { table.remove(this, b); }
}
Edit:
Проблема с этим дизайном - сборка мусора. таблица будет содержать ссылки на объекты, подавляя тем самым их коллекцию. В Java вы можете использовать объект WeakReference для преодоления этой проблемы. Я почти уверен, что в мире .Net что-то похожее
Кроме того, стол может быть одиночным. Я не очень люблю одиночные игры. Здесь, синглтон сделает ассоциацию A-B уникальной для всей вашей программы. Это может быть чем-то нежелательным, но это зависит от ваших конкретных потребностей.
Наконец, (просто для того, чтобы разобраться в контекстах) этот дизайн работает так же, как отношения «многие ко многим» в реляционных базах данных.