代码之家  ›  专栏  ›  技术社区  ›  Jack Ryan

泛型类和接口的非泛型版本

  •  9
  • Jack Ryan  · 技术社区  · 17 年前

    我经常发现自己处于这样一种情况:我创建了一个通用接口或类,然后希望以非通用的方式使用这个类或接口的不同版本。例如,我可能有这样一个界面:

    interface ICanCreate<T>
    {
        T NewObject();
    }
    

    它允许类成为该类型的工厂。然后我想在一个通用工厂类中注册它们,所以我尝试编写如下内容:

    public class Factory
    {
        private Dictionary<Type, ICanCreate> mappings; // what do I put here????
    
        public void RegisterCreator<T>(ICanCreate<T> creator)
        {            
        }
    
        public T Create<T>()
        {            
        }
    }
    

    2 回复  |  直到 17 年前
        1
  •  11
  •   Jon Skeet    17 年前

    你要么就用 object 在你的字典声明中(都是私人的,而且 ICanCreate 接口哪个 ICanCreate<T> 延伸。

        2
  •  3
  •   Rasmus Faber    17 年前

    有趣的是,这是一个在C#4.0中解决的问题:

    public interface ICanCreate<out T> // covariant
    {
        T NewObject();
    }
    
    public class Factory
    {
        private Dictionary<Type, ICanCreate<object>> mappings = new Dictionary<Type, ICanCreate<object>>();
    
        public void RegisterCreator<T>(ICanCreate<T> creator) where T:class
        {            
          mappings[typeof(T)] = creator;
        }
    
        public T Create<T>()
        {            
          ICanCreate<object> creator = mappings[typeof(T)];
          return (T) creator.NewObject(); // I do not think you can get rid of this cast
        }
    }