2009-09-30 49 views
1

这段代码编译但看起来很奇怪。 我有一个典型的简单的父母/孩子关系,这是用非常奇怪的方式使用泛型实现的。 但我似乎无法找到任何其他方式来做到这一点。真奇怪的C#泛型的问题

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

这似乎是不带类型的工作。

这是你在找什么?

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

这就是答案!卫生署!只需要检查我的问题是问题:-) – Petras

1

MSDN documentation,它指出:

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

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

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

0

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

​​

如果您担心您的收藏如何详细,你可以驯服的角度用括号位:

public SpecificObjectContainer : Container<SpecificObject> 
{ 
}