インターフェイスを介して通信する複数のクラス間でメッセージをやり取りしようとしています。しかし、私はできるだけ一般的なものにしたいので、受信メッセージのメッセージ タイプが送信タイプと異なる可能性があるため、問題に遭遇しました。わかりやすくするためにいくつかのコードを貼り付けました。
以下のコードはコンパイルされません。これは、インターフェイスの実装が、受信メッセージを追加することになっているブロッキング コレクションの型とは異なる型を渡すためです。着信タイプとは異なる可能性のあるタイプを送信できるようにしたい (着信タイプは明らかに、ブロッキング コレクション内の要素のタイプと常に一致します)。インターフェイスやクラスを再設計する必要がある場合でも、何らかのキャストや解析を回避できますか?
インターフェイスの操作に関しては、私はまだかなり新鮮で、再帰、スタック オーバーフロー エラーなどに苦労しました。したがって、設計に関して改善できることや簡単な修正について提案がある場合は、私が学ぶのを手伝ってください. より良いパターンを実装する方法を理解したいと思っています。
ありがとう
public interface IClientMessaging
{
void MessagePassing<U>(U message);
}
public class InProcessMessaging<T> : IClientMessaging
{
private Dictionary<Type, List<IClientMessaging>> Subscriptions;
public BlockingCollection<T> MessageBuffer;
public InProcessMessaging(Dictionary<Type, List<IClientMessaging>> subscriptions)
{
//Setup Message Buffer
MessageBuffer = new BlockingCollection<T>();
//Subscribe
Type type = typeof(T);
if (subscriptions.Keys.Contains(type))
{
subscriptions[type].Add(this);
}
else
{
subscriptions.Add(type, new List<IClientMessaging>());
subscriptions[type].Add(this);
}
Subscriptions = subscriptions;
}
public void SendMessage<U>(U message)
{
//Send message to each subscribed Client
List<IClientMessaging> typeSubscriptions = Subscriptions[typeof(U)];
foreach (IClientMessaging subscriber in typeSubscriptions)
{
subscriber.MessagePassing<U>(message);
}
}
public T ReceiveMessage()
{
return MessageBuffer.Take();
}
public bool ReceiveMessage(out T item)
{
return MessageBuffer.TryTake(out item);
}
//Interface Implementation
public void MessagePassing<U>(U message)
{
MessageBuffer.Add(message); //<-"Cannot convert from U to T" [this is because I want
//to send messages of a different type than the receiving type]
}
}