此代码编译但看起来很奇怪。 我在这里有一个典型而简单的父/子关系,这是以非常奇怪的方式使用泛型实现的。 但我似乎无法找到任何其他方式。
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
}
}
这段代码可以简化吗?
答案 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>
{
}