Ich habe eine Klasse A, die eine Liste von Objekten der Klasse B verwaltet. Aber jedes Objekt der Klasse B kann in jedem Objekt der Klasse A referenziert werden. Die Klasse B verwaltet auch eine Liste von Objekten der Klasse A, in der sie referenziert wird. Das Programm kann und wird (mehrere) Objekte sowohl der Klasse A als auch der Klasse B "nach Belieben" erstellen und auch löschen.
Wenn ich C# verwende, kann ich Objekte aus beiden Klassen mit folgendem Code hinzufügen und löschen
public class A
{
private List<B>ListOfObjects_B;
public bool Add(B Object)
{
bool bAdd = false;
if ((Object != null) && (ListOfObjects_B.IndexOf(B) <0))
{
ListOfObjects_B.Add(Object);
Object.Add(this);
bAdded = true;
}
return bAdded;
}
public bool Delete(B Object)
{
bool bDeleted = ListOfObjects_B.Remove(Object);
if (bDeleted == true) Object.Delete(this);
return bDeleted;
}
}
public class B
{
private List<A>ListOfObjects_A;
public bool Add(A Object)
{
bool bAdd = false;
if ((Object != null) && (ListOfObjects_A.IndexOf(A) <0))
{
ListOfObjects_A.Add(Object);
Object.Add(this);
bAdded = true;
}
return bAdded;
}
public bool Delete(A Object)
{
bool bDeleted = ListOfObjects_A.Remove(Object);
if (bDeleted == true) Object.Delete(this);
return bDeleted;
}
}
Dies wird funktionieren, da durch das Entfernen/Hinzufügen des Objekts in die ListOfObjects beim ZWEITEN Mal (durch Rekursion) die Funktion aufgerufen wird und das Löschen/Hinzufügen fehlschlägt, wodurch eine Endlosschleife vermieden wird.
Aber ich mag diesen Code nicht, auch wenn A und B nicht viel über die andere Klasse wissen und nur eine Delete/Add-Funktion aufrufen.
Ich nehme an, diese Art von Problem ist allgemein und es gibt ein Entwurfsmuster, um es so zu behandeln, dass eine Rekursion vermieden werden kann und die Aktualisierung beider Listen "einfach besser" ist. Welches Entwurfsmuster sollte ich verwenden? Ich würde es begrüßen, wenn Sie auch etwas Code hinzufügen würden.
0 Stimmen
Zu Ihrem Kommentar (Antwort auf meine nachstehende Antwort): Ich denke, man kann die von Ihnen beschriebene Situation (mehrere verschiedene Assoziationen zwischen Klassenpaaren) durch Parametrisierung (über Typparameter) der Klasse AssocationTable behandeln. So hätten Sie AssociationTable<A,B> für A-B-Paare und AssociationTable<C,D> für C-D-Paare, usw.