这是我当前的类型层次结构:
我正在尝试在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;
}
理想情况下,它还应该返回对象的副本作为其子类,而不是修改原始对象。
目前,我有两个类实现的Interface IEdge:LineSegment和Arc。我使用Generics作为抽象超类PlaneRegion,因为两个继承类Polygons和NonPolygon都有planeBoundaries,但是Polygon只包含直线(lineSegments),而NonPolygon可以有直线或曲线(LineSegment或Arc)所以我实现了就像在这个问题中一样,您可以在下面的代码段中看到:Override a Property with a Derived Type and Same Name C#
但是,因为PlaneRegion中的PlaneRegion和PlaneBoundaries是泛型类型,所以当我尝试在PlaneBoundaries上调用shift时会导致问题。以下是目前如何实施Shift的示例:
//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));
}
有没有办法在这样的通用列表上调用shift或者限制T在编译时实现IEdge的类的可能性?我已经尝试将PlaneRegion中的Shift设置为通用,但它也不起作用。
另外,理想情况下,我希望它将原始对象的副本作为子对象返回,并修改其上的PlaneBoundaries而不是原始的Objects PlaneBoundaries,但不知道如何做到这一点。
答案 0 :(得分:1)
您可以缩小PlaneRegion
课程,只接受T中IEdge
接口的实现:
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));
}