次のインターフェイスとクラスの宣言を考えてみましょう。インターフェイスを実装する基本クラスから派生したインスタンスのリストを作成する方法は?
public interface IMessage
{
string Body { get; set; }
}
public abstract class MessageBase : IMessage
{
public string Body { get; set; }
}
public class MessageA : MessageBase { }
public class MessageB : MessageBase { }
public class MessageC : MessageBase { }
public interface IMessageProcessor<T> where T : IMessage
{
Action<T> ProcessorAction { get; set; }
}
public abstract class MessageProcessorBase<T> : IMessageProcessor<T> where T : MessageBase
{
public Action<T> ProcessorAction { get; set; }
}
public class MessageAProcessor : MessageProcessorBase<MessageA> { }
public class MessageBProcessor : MessageProcessorBase<MessageB> { }
public class MessageCProcessor : MessageProcessorBase<MessageC> { }
は今、私はそうのようなプロセッサインスタンスのリストを宣言したいのですが、一般的なタイプは私がリストに任意の派生プロセッサタイプを追加することができますかを把握することはできません。
var processors = new List<???>();
processors.Add(new MessageAProcessor());
processors.Add(new MessageBProcessor());
processors.Add(new MessageCProcessor());
私が試してみました:
// compiles but throws InvalidCastException
var processors = new List<IMessageProcessor<IMessage>>();
processors.Add((IMessageProcessor<IMessage>)new MessageAProcessor());
と
// compiles but throws InvalidCastException
var processors = new List<IMessageProcessor<MessageBase>>();
processors.Add((IMessageProcessor<MessageBase>)new MessageAProcessor());
と
// won't compile
var processors = new List<MessageProcessorBase<MessageBase>>();
processors.Add((MessageProcessorBase<MessageBase>)new MessageAProcessor());
をこのリストのタイプは何をすべきですか?私はここで明白な何かを見逃しているに違いないことを知っここのお手伝いが大変ありがとうございます。ありがとう!
'ProcessMessage'の実装を' var msg = message as T' –
@AlekseyLに移動することができます。良い点、修正、ありがとう – 3615
@ 3615ありがとう - 私はそれを見ることが明らかになったようです。 –