Ich habe Klassen, die miteinander kommunizieren müssen. Das Problem ist, dass, wenn Sie eine andere (eine Kind-Eltern-Beziehung) enthalten, die Dinge schwierig werden. Sie müssen entweder eine Instanz des übergeordneten Elements an das untergeordnete Element übergeben (dann welches Sie zuerst erstellen, wenn Sie die Abhängigkeitsinjektion verwenden), oder Sie können Delegaten/Ereignisse verwenden. Aber ich möchte die Tatsache durchsetzen, dass der Elternteil in der Lage sein muss, mit dem Ereignis umzugehen, das das Kind auslöst. Nicht sicher, wie das geht. Ich möchte auch nicht mehrere Abonnenten für die Veranstaltung.Was ist das beste Muster für die Zwei-Wege-Kommunikation zwischen Klassen?
Die Eltern-Kind-Beziehung fühlt sich einfach falsch für Zwei-Wege-Kommunikation. Es ist leider nicht der Fall, dass eines der Objekte immer initiiert und das andere antwortet. Beide können initiieren und der andere sollte antworten.
Gibt es ein anderes Muster, das ich vermisse?
UPDATE: Sorry das ist ziemlich schwer zu erklären. Ich habe vergessen hinzuzufügen, dass wenn eine Klasse eine Nachricht an eine andere Klasse sendet, sie die Antwort nicht sofort erwartet. Die Antwort kommt asynchron, weshalb Sie entweder eine Instanz des übergeordneten Elements benötigen, um die richtige Methode oder einen Delegaten/ein Ereignis aufzurufen. Das folgende Beispiel ist Pseudocode. Hoffentlich ist es genug, um die Idee zu bekommen. Sollte ich mir das Mediatormuster ansehen?
public class Foo
{
public void SendMessageAToBar()
{
MessageA msg = new MessageA();
Bar.ReceiveMessageAFromFoo(msg);
}
public void ReceiveMessageARespFromBar(MessageAResp msgResp)
{
//Got a response do something
}
public void ReceiveMessageBFromBar(MessageB msg)
{
//Do something msg
MessageBResp msgBResp = new MessageBResp();
Bar.ReceiveMessageBRespFromFoo()
}
}
public class Bar
{
public void ReceiveMessageAFromFoo(MessageA msg)
{
//DO something.
MessageAResp resp = new MessageAResp();
Foo.ReceiveMessageARespFromBar(resp);
}
public void SendMessageBToFoo()
{
MessageB msg = new MessageB();
Foo.ReceiveMessageBFromBar(msg);
}
public void ReceiveMessageBRespFromFoo(MessageBResp msgResp)
{
//Got a response do something
}
}
Was ist anders an dem Kind, was bedeutet, dass Sie hier keine Ereignisse verwenden möchten? –
Können Sie Codebeispiele für ein Kind und ein Elternelement hinzufügen? – jgauffin
Vielleicht hilft es, wenn Sie beschreiben, welche Objekte Sie als Eltern und Kinder bezeichnen. Es ist nicht immer schlecht, wenn das Kind einen Verweis auf Eltern hat. Es gibt viele Fälle wie TreeView, XmlNode usw., und auch die Verwendung eines Observers ist eine sehr praktikable Option. Nicht sicher, warum Sie sagen: "Ich möchte auch nicht mehrere Abonnenten für die Veranstaltung". Kannst du das auch erklären? –