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

协方差与反方差

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

    Message1D Message2D 都继承自 Message :

    public abstract class Message {}
    public class Message1D : Message {}
    public class Message2D : Message {}
    

    接口 IFoo 和班级 Bar Baz ,实现它:

    public interface IFoo<out G, in T> 
        where G : Message 
        where T : Message
    {
        G PassMessage(T input);
    }
    
    public class Bar : IFoo<Message1D, Message1D>
    {
        public Message1D PassMessage(Message1D input)
        {
            throw new NotImplementedException();
        }
    }
    
    public class Baz : IFoo<Message2D, Message2D>
    {
        public Message2D PassMessage(Message2D input)
        {
            throw new NotImplementedException();
        }
    }
    

    public class Network
    {
        private List<IFoo<Message, Message>> messages = new List<IFoo<Message, Message>>();
    
        public void AddBar()
        {
            messages.Add(new Bar());
        }
    
        public void AddBaz()
        {
            messages.Add(new Baz());
        }
    }
    

    我有个例外:

    无法转换 酒吧 IFoo<Message,Message>

    巴兹 如果<消息,消息>

    我该怎么加 列表中的实例?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Servy    6 年前

    如何将Bar和Baz实例添加到列表中?

    IFoo<Message1D, Message> 作为 IFoo<Message, Message> ,但你不能 IFoo<Message, Message1D> 如果<消息,消息> . 如果这是有效的,那么将允许某人将2D消息传入只能处理1D消息的对象。

        2
  •  0
  •   Bagdan Gilevich    6 年前

    但是如果您能够以某种方式保证类型安全,那么您可以尝试显式地实现 IFoo<Message1D, Message> 除了 IFoo<Message1D, Message1D> 具体如下:

    public class Bar : IFoo<Message1D, Message1D>, IFoo<Message1D, Message>
    {
        public Message1D PassMessage(Message1D input)
        {
            // ...
        }
    
        Message1D IFoo<Message1D, Message>.PassMessage(Message input)
        {
            try
            {
                return PassMessage((Message1D) input);
            }
            catch (InvalidCastException)
            {
                // Message2D passed, handling exception
                // ...
            }
        }
    

    IFoo<Message2D, Message> 对于 Baz .