C#基类型列表添加泛型子实例
我有一个基类C#基类型列表添加泛型子实例,c#,list,generics,inheritance,C#,List,Generics,Inheritance,我有一个基类MessageBase public abstract class MessageBase {} Message1D和Message2D继承自MessageBase public class Message1D : MessageBase {} public class Message2D : MessageBase {} public abstract class Foo<T> where T : MessageBase {} 我还有一个泛型类Foo,其泛型参数类
MessageBase
public abstract class MessageBase {}
Message1D
和Message2D
继承自MessageBase
public class Message1D : MessageBase {}
public class Message2D : MessageBase {}
public abstract class Foo<T> where T : MessageBase {}
我还有一个泛型类Foo
,其泛型参数类型为MessageBase
public class Message1D : MessageBase {}
public class Message2D : MessageBase {}
public abstract class Foo<T> where T : MessageBase {}
我的问题是:
public class Network
{
private List<Foo<MessageBase>> messages = new List<Foo<MessageBase>>();
public void AddBar()
{
messages.Add(new Bar()); //can not add
}
public void AddBaz()
{
messages.Add(new Baz()); //can not add
}
}
公共类网络
{
私有列表消息=新列表();
公共void AddBar()
{
messages.Add(new Bar());//无法添加
}
公共无效AddBaz()
{
messages.Add(new Baz());//无法添加
}
}
由于Bar
和Baz
继承自Foo
,并且T的类型为MessageBase
,我希望我能够将Bar
和Baz
实例添加到列表中,但是由于以下原因,我无法添加到列表中:
无法从Bar
转换为Foo
及
无法从Baz
转换为Foo
我想将
Bar
和Baz
实例添加到列表中。我该怎么做呢?在这种情况下,您应该声明接口IFoo
,而不是抽象类Foo
out关键字,意思是协方差,将允许您执行所需的操作,即将实现IFoo
/IFoo
接口的Baz
类投射到IFoo
接口:
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());
}
}
公共抽象类MessageBase{}
公共类Message1D:MessageBase{}
公共类Message2D:MessageBase{}
公共接口IFoo,其中T:MessageBase{}
公共类栏:IFoo{}
公共类Baz:IFoo{}
公共班级网络
{
私有列表消息=新列表();
公共void AddBar()
{
messages.Add(新条());
}
公共无效AddBaz()
{
messages.Add(新的Baz());
}
}
您的问题是什么?@vasily.sib我想将Bar和Baz实例添加到列表中。我该怎么做?Foo
不是从Foo
继承的,所以您现在不能。您可以向Foo
和Foo
添加一些公共接口,并更改消息的定义。