J'ai des cours qui doivent communiquer entre eux. Le problème est que si vous faites l'un contenir l'autre (une relation parent-enfant) alors les choses deviennent difficiles. Vous devez soit passer une instance du parent dans l'enfant, (alors lequel créez-vous en premier si vous utilisez l'injection de dépendance) ou vous pouvez utiliser des délégués/événements. Mais je veux imposer le fait que le parent doit être capable de gérer l'événement que l'enfant soulève. Pas trop sûr de savoir comment faire ça. Je ne veux pas non plus de plusieurs abonnés à l'événement.Quel est le meilleur modèle pour la communication bidirectionnelle entre les classes?
La relation parent-enfant se sent juste mal pour la communication bidirectionnelle. Malheureusement, il ne s'agit pas d'un cas où l'un des objets initie toujours et l'autre répond. L'un peut initier et l'autre devrait répondre.
Y a-t-il un autre motif qui me manque?
MISE À JOUR: Désolé, c'est assez difficile à expliquer. J'ai oublié d'ajouter que lorsqu'un cours envoie un message à une autre classe, il n'attend pas la réponse immédiatement. La réponse arrive de manière asynchrone, ce qui explique pourquoi vous avez besoin d'une instance du parent pour appeler la bonne méthode ou d'un délégué/événement. Désolé l'exemple ci-dessous est un pseudo code. Espérons que c'est suffisant pour avoir l'idée. Dois-je regarder le modèle de médiateur.
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
}
}
Qu'est-ce qui différencie l'enfant de ce que vous ne voulez pas utiliser ici? –
Pouvez-vous ajouter des exemples de code d'un enfant et d'un parent? – jgauffin
Peut-être que cela vous aidera si vous décrivez les objets réels auxquels vous faites référence en tant que parents et enfants. Ce n'est pas toujours mauvais si l'enfant tient un ref aux parents. Il existe de nombreux cas comme TreeView, XmlNode etc, et l'utilisation d'un observateur est également une option très viable. Je ne sais pas pourquoi vous dites "Je ne veux pas non plus que plusieurs abonnés à l'événement". Pourriez-vous expliquer cela aussi? –