调用的泛型类型从抽象父类List的方法
问题描述:
这是我目前的类型层次:调用的泛型类型从抽象父类List的方法
我想实现在PlaneRegion
的方法,将调用一个在名为Shift()
方法列出它的派生类在列表中所有的人都称为PlaneBoundaries但他们是不同类型的
像这样的:
public abstract class PlaneRegion<T>
{
public abstract List<T> PlaneBoundaries { get; set; }
}
public class Polygon : PlaneRegion<LineSegment>
{
public override List<LineSegment> PlaneBoundaries
{
get { return _planeBoundaries; }
set { _planeBoundaries = value; }
}
protected List<LineSegment> _planeBoundaries;
}
public class NonPolygon : PlaneRegion<IEdge>
{
public override List<IEdge> PlaneBoundaries
{
get { return _planeBoundaries; }
set { _planeBoundaries = value; }
}
private List<IEdge> _planeBoundaries;
}
理想情况下,它也应该返回对象的副本作为其子类,而不是修改原始对象。
目前,我有接口IEdge由两个类实现:线段和圆弧。我使用泛型的抽象超PlaneRegion因为两个继承类,多边形和NonPolygon,都有planeBoundaries,而是一个多边形只包含直线(lineSegments),而NonPolygon可以直线或曲线(线段或圆弧),所以我实现像这个问题,你可以在下面的代码片段,请参阅:Override a Property with a Derived Type and Same Name C#
然而,由于PlaneRegion和PlaneBoundaries在PlaneRegion是一个泛型类型它会导致问题,当我试图呼吁PlaneBoundaries转变。下面是移是如何目前实施的例子:
//In PlaneRegion
public PlaneRegion<T> Shift(Shift inShift)
{
//does not work because Shift isn't defined for type T
this.PlaneBoundaries.Shift(passedShift);
}
//in Polygon
public override Polygon Shift(Shift passedShift)
{
return new Polygon(this.PlaneBoundaries.Shift(passedShift));
}
//In NonPolygon
public override NonPolygon Shift(Shift passedShift)
{
return new NonPolygon(this.PlaneBoundaries.Shift(passedShift));
}
有没有办法来调用一个泛型列表转变这样或T的可能性限制在编译时实施IEdge类?我曾尝试将PlaneRegion中的Shift设置为通用,但它也不起作用。
此外,理想情况下,我希望它将原始对象的副本作为子对象返回,并在这些对象上修改PlaneBoundaries而不是原始对象PlaneBoundaries,但不要这样做。
答
您可以缩小PlaneRegion
类承认IEdge
接口的唯一实现在T:
public abstract class PlaneRegion<T> where T : IEdge
{
public abstract List<T> PlaneBoundaries { get; set; }
}
此外,在Shift
功能,您可能希望将其应用到每一个项目列表,而不是整个列表,所以你应该将其更改为:
//In PlaneRegion
public PlaneRegion<T> Shift(Shift inShift)
{
this.PlaneBoundaries.ForEach(x => x.Shift(passedShift));
}
您是否试过限制泛型方法? '公共PlaneRegion移(移inShift)其中T:IEdge' –
2014-09-30 18:58:44
我想'IEdge'有一个'Shift'方法,你应该在'PlanBoundaries'每个项目,而不是名单本身上调用。如果是这样的话@YuvalItzchakov对于如何处理它是正确的,这样你就不需要重写'Polygon'和'NonPolygon'类中的'Shift'。 – juharr 2014-09-30 19:07:47