代码之家  ›  专栏  ›  技术社区  ›  koryakinp

基类型列表添加泛型子实例

  •  2
  • koryakinp  · 技术社区  · 6 年前

    我有一个基类 MessageBase

    public abstract class MessageBase {}
    

    Message1D Message2D 继承自 消息库

    public class Message1D : MessageBase {}
    public class Message2D : MessageBase {}
    

    我还有一个泛型类 Foo 具有类型的泛型参数 消息库

    public abstract class Foo<T> where T : MessageBase {}
    

    两个班 Bar Baz :

    public class Bar : Foo<Message1D> {}
    public class Baz : Foo<Message2D> {}
    

    我的问题是:

    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 
        }
    }
    

    自从 酒吧 巴兹 继承自 Foo<T> T是 消息库 我希望我能 酒吧 巴兹 实例列表,但我不能由于:

    无法从转换 酒吧 Foo<MessageBase>

    无法从转换 巴兹 Foo<消息库>

    我想补充 酒吧 巴兹 列表中的实例。我该怎么做?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Slava Utesinov    6 年前

    在这种情况下,你应该声明 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());
        }
    }