인터페이스를 통해 통신하는 여러 클래스간에 메시지를 전달하려고합니다. 그러나 가능한 한 제네릭을 사용하고자 할 때 수신 메시지의 메시지 유형이 발신 유형과 다를 수 있으므로 문제가 발생했습니다. 나는 그것을 명확하게하기 위해 몇 가지 코드를 붙여 넣었다.일반 인터페이스 및 형식 구문 분석
인터페이스 구현이 들어오는 메시지를 추가하기로되어있는 차단 컬렉션의 형식과 다른 형식을 전달하기 때문에 아래 코드는 컴파일되지 않습니다. 들어오는 유형과 잠재적으로 다른 유형을 보낼 수 있기를 원합니다 (들어오는 유형은 항상 블로킹 콜렉션의 요소 유형과 일치합니다). 인터페이스 나 클래스를 다시 디자인해야하는 경우에도 캐스팅이나 파싱을 수행 할 수 있습니까?
인터페이스를 사용하여 작업 할 때 여전히 매우 신선하고 재귀, 스택 오버플로 오류 등으로 어려움을 겪습니다. 따라서, 현명한 디자인 또는 빠른 수정을 제안 할 수있는 제안이 있으면 배우십시오. 더 나은 패턴을 구현하는 방법을 알고 싶어합니다.
감사
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'의 가입자 목록을 관리하는 이유는 무엇입니까? –