私は、インターフェイス経由で通信するいくつかのクラス間でメッセージを渡そうとしています。しかし、私ができるだけジェネリックに行きたいので、着信メッセージのメッセージタイプが発信タイプと異なる可能性があるため、問題が発生しました。私はそれを明確にするためにいくつかのコードを貼り付けました。一般的なインターフェイスとタイプの解析
インターフェイスインプリメンテーションが着信メッセージを追加するはずのブロッキングコレクションのタイプと異なるタイプを渡すため、以下のコードはコンパイルされません。私は、着信タイプとは異なる可能性があるタイプを送信できるようにしたい(着信タイプは、常にブロッキングコレクションのエレメントのタイプと常に一致します)。インターフェイスやクラスを再設計する必要がある場合でも、何らかのキャストや解析を行うことができますか?
私はまだインターフェイスを使って作業することになり、再帰、スタックオーバーフローエラーなどで苦労しています。だから、もしあなたが私が賢明なデザインを改善したり、すぐに修正したりできるような提案があれば、私が学ぶのを助けてください。より良いパターンを実装する方法を理解することが非常に熱心です。
おかげ
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]
}
}
なぜ 'InProcessMessaging'も' IClientMessaging'を実装し、 'IClientMessaging'のサブスクライバリストを管理していますか? –