Ho classi che devono comunicare tra loro. Il problema è che se ne fai uno contiene l'altro (una relazione genitore figlio), allora le cose si complicano. È necessario passare un'istanza del genitore nel figlio, (quindi quale si crea prima se si sta utilizzando l'iniezione di dipendenza) oppure è possibile utilizzare delegati/eventi. Ma voglio far rispettare il fatto che il genitore deve essere in grado di gestire l'evento che il bambino solleva. Non sei troppo sicuro di come farlo. Inoltre, non voglio più abbonati all'evento.Qual è lo schema migliore per la comunicazione bidirezionale tra le classi?
La relazione genitore-figlio è semplicemente sbagliata per la comunicazione bidirezionale. Sfortunatamente non è un caso che uno degli oggetti inizi sempre e l'altro risponda. O può iniziare e l'altro dovrebbe rispondere.
C'è un altro schema che mi manca?
AGGIORNAMENTO: Spiacente, questo è abbastanza difficile da spiegare. Ho dimenticato di aggiungere che quando una classe invia un messaggio a un'altra classe non si aspetta la risposta immediatamente. La risposta arriva in modo asincrono ed è per questo che hai bisogno di un'istanza del genitore per chiamare il metodo giusto o un delegato/evento. Spiacente, l'esempio qui sotto è pseudo codice. Spero sia abbastanza per avere l'idea. Dovrei guardare il modello di mediatore.
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
}
}
Cosa c'è di diverso nel bambino che significa che non vuoi usare gli eventi qui? –
Puoi aggiungere esempi di codice di un bambino e un genitore? – jgauffin
Forse sarà d'aiuto se descrivi quali oggetti reali ti riferisci come genitori e figli. Non è sempre male se il bambino possiede un riferimento al genitore. Ci sono molti casi come TreeView, XmlNode, ecc. E anche l'uso di un Observer è un'opzione molto valida. Non sei sicuro del motivo per cui stai dicendo "Inoltre, non voglio più abbonati all'evento". Potresti spiegarlo anche tu? –