真奇怪的C#泛型问题

时间:2009-09-30 04:38:05

标签: c# generics list

此代码编译但看起来很奇怪。 我在这里有一个典型而简单的父/子关系,这是以非常奇怪的方式使用泛型实现的。 但我似乎无法找到任何其他方式。

class SampleObject<T> //I don't want to make this a generic but am forced to
{
  //The SampleContainer this object is in
  //This must be located in this base class
  public SampleContainer<T> Parent { get; set; }
}

class SpecificObject : SampleObject<SpecificObject>
//SampleObject<SpecificObject> !!? This is the bizzare bit
//It seems really strange but necessary for compilation to work
{
}


//A class to contain a List of objects derived from SampleObjects
class SampleContainer<T>
{
  public List<T> List;
}


class Start
{
  public void Test()
  {
    SampleContainer<SpecificObject> container = new SampleContainer<SpecificObject>();

    SpecificObject o = new SpecificObject(); //create an object
    container.List.Add(o); //add it to the list
    o.Parent = container; //set its parent
  }
}

这段代码可以简化吗?

3 个答案:

答案 0 :(得分:3)

这似乎没有类型。

这是你在找什么?

class SampleObject //I don't want to make this a generic but am forced to
    {

        //The SampleContainer this object is in
        //This must be located in this base class
        public SampleContainer<SampleObject> Parent;//{ get; set; }
    }

    class SpecificObject : SampleObject
    //SampleObject<SpecificObject> !!? This is the bizzare bit
    //It seems really strange but necessary for compilation to work
    {
    }


    //A class to contain a List of objects derived from SampleObjects
    class SampleContainer<T>
    {
        public List<T> List;
    }


    class Start
    {
        public void Test()
        {
            SampleContainer<SampleObject> container = new SampleContainer<SampleObject>();

            SpecificObject o = new SpecificObject(); //create an object
            container.List.Add(o); //add it to the list
            o.Parent = container; //set its parent
        }
    }

答案 1 :(得分:1)

MSDN documentation中,它声明:

  

从通用基础派生时   类,你必须提供一个类型   参数而不是基类   泛型类型参数:

public class BaseClass<T>
{...}
public class SubClass : BaseClass<int>
{...}

这可能是C#设计人员在编译器中设置的约束。它们要求派生类型必须在编译时指定泛型参数的类型。我不太清楚为什么。

答案 2 :(得分:0)

泛型可以创建一些笨重的类层次结构。但是,SpecificObject:SampleObject的语法确实有意义,因为您声明该对象具有父关系。我能看到你做到这一点的另一种方法是用界面拆分层次结构。它买不多,但它可能有助于澄清意图。

interface IHasParent<T>
{
     T Parent { get; set; }
}

public class SpecificObject : IHasParent<SpecificObject>
{
    public SpecificObject Parent { get; set; }
}

如果您担心收藏的详细程度,可以使用以下方法稍微调整尖括号:

public SpecificObjectContainer : Container<SpecificObject>
{
}