在这种情况下,你应该声明
interface IFoo<out T>
而不是
abstract class Foo<T>
.
外面的
关键字,意思是
协方差
,将允许您执行所需的操作,即铸造
Bar
/
Baz
类,它实现
IFoo<Message1D>
/
IFoo<Message2D>
,到
IFoo<MessageBase>
接口:
public abstract class MessageBase { }
public class Message1D : MessageBase { }
public class Message2D : MessageBase { }
public interface IFoo<out T> where T : MessageBase { }
public class Bar : IFoo<Message1D> { }
public class Baz : IFoo<Message2D> { }
public class Network
{
private List<IFoo<MessageBase>> messages = new List<IFoo<MessageBase>>();
public void AddBar()
{
messages.Add(new Bar());
}
public void AddBaz()
{
messages.Add(new Baz());
}
}