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

如何创建采用3种类型的泛型类

  •  0
  • scope_creep  · 技术社区  · 16 年前

    我正在尝试创建一个具有3种类型的泛型类,要么是一个简单的字符串, IList<string> 或A IList<OntologyStore> .

    public class OntologyStore
    {
    }
    
    public sealed class jim<T> where T:new()
    {
        string J;
        IList<string> X = null;
        IList<OntologyStore> X1 = null;
    
        public jim()
        {
            if (typeof(T) == typeof(String))
            {
                J = string.Empty;
            }
            if (typeof(T) == typeof(OntologyStore))
            {
                X1 = new List<OntologyStore>();
            }
            if (typeof(T)==typeof(IList))
            {
                X = new List<string>();
            }
        }
    }
    

    我可以很容易地创造出来,你会希望它能发挥作用,

    jim<OntologyStore> x1=new jim<jim<OntologyStore>()
    

    正如你所期望的,但当我投入

    jim<string> x2=new jim<string>()
    

    编译器报告字符串是非abtract类型,这是您所期望的。

    是否可以创建一个泛型类,该类可以实例化为包含字符串的类,或者 ilist<字符串> ilist<本体日志存储> ?

    5 回复  |  直到 16 年前
        1
  •  0
  •   Reed Copsey    16 年前

    你不能直接用泛型来实现这一点。泛型约束必须指定一个类型,该类型是所有实现的约束…在您的示例中,没有用于 System.String , IList<String> IList<OntologyStore> 它是这些类型的唯一基类或接口(因为 System.Object IEnumerable 是唯一常见的基类型,我相信…)

    不过,在本例中,我建议重新考虑您的设计,以避免使用泛型。

    防止重复功能的一个选项是生成一个基类,并具有3个工厂方法,这些方法构造并返回有关特定类型的子类:

    public class Jim
    {
        protected Jim() {}
    
        public Jim Create(string value)
        {
            return new StringJim(value);
        }
    
        private class StringJim : Jim
        {
            public StringJim(string value) { // ...
            }
        }
        // Do same for IList<string> and IList<OntologyStore>..
    
        // Add common methods here...
    }
    
        2
  •  1
  •   Jon    16 年前

    这正是这种情况的定义,在这种情况下,您不应该试图创建这样的类,而是拥有一个接口(或抽象基),并从中派生出三个不同的具体类。

        3
  •  1
  •   mfeingold    16 年前

    我认为您的问题与这样一个事实有关:字符串类没有“new()”约束所要求的公共无参数构造函数。

        4
  •  0
  •   MUG4N    16 年前

    你必须设置

    公共密封类jim,其中t:class,new()。

    如果您还想使用字符串

    有关详细信息,请参阅此处: http://msdn.microsoft.com/en-us/library/d5x73970.aspx

        5
  •  0
  •   unholysampler    16 年前

    如果您正在编写一个泛型类,并且您正在根据T的类型进行操作,那么这通常意味着对于泛型来说这不是一个好的情况,或者您没有正确地构造该类。

    在这种情况下,它看起来更适合使用接口为类提供共享类型。如果它们最终共享某种实现,那么使用基类而不是接口。

    推荐文章