如何创建从实现接口的基类派生的实例列表
本文关键字:接口 基类 派生 列表 实例 实现 何创建 创建 | 更新日期: 2023-09-27 18:07:56
考虑下面的接口和类声明。
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());
I have try:
// 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());
这个列表应该是什么类型的?我知道我肯定错过了一些明显的东西。任何帮助都将是非常感激的。谢谢!
您需要引入IMessageProcessor
并从中继承所有的处理器。在列表中,你必须使用这个接口。
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 void ProcessMessage(IMessage message) {
var msg = message as T;
ProcessorAction(msg);
}
}
public interface IMessageProcessor {
void ProcessMessage(IMessage message);
}
public class MessageAProcessor : MessageProcessorBase<MessageA>,IMessageProcessor {
}
public class MessageBProcessor : MessageProcessorBase<MessageB>,IMessageProcessor {
}
public class MessageCProcessor : MessageProcessorBase<MessageC>,IMessageProcessor {
}
和处理器:
var processors = new List<IMessageProcessor>();
processors.Add(new MessageAProcessor());
processors.Add(new MessageBProcessor());
processors.Add(new MessageCProcessor());
由于ISomething<Type1>
和ISomething<Type2>
之间没有继承关系,所以不能有包含这些类型混合的对象列表
唯一真正的选择是强制一些基本类型-要么使用List<object>
,要么更好地为IMessageProcessor<T>
提供基础非泛型接口,如IMessageProcessor<T> : IMessageProcessor
。
不幸的是,这也意味着你不能使用非强制类型转换的泛型类型访问属性/参数。
我不知道你想要完成什么,但是你的代码确实不能工作。
我做了以下操作:
public class MessageAProcessor : MessageProcessorBase<MessageBase> { }
public class MessageBProcessor : MessageProcessorBase<MessageBase> { }
public class MessageCProcessor : MessageProcessorBase<MessageBase> { }
然后:
var processors = new List<MessageProcessorBase<MessageBase>> ();
processors.Add(new MessageAProcessor());
processors.Add(new MessageBProcessor());
processors.Add(new MessageCProcessor());
。
问题是
public class MessageAProcessor : MessageProcessorBase<MessageA> { }
太具体了,你不能在List<>
中把它转换回MessageProcessorBase<MessageBase>
。