2014-09-30 117 views
2

这是我目前的类型层次:调用的泛型类型从抽象父类List的方法

enter image description here

我想实现在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,但不要这样做。

+2

您是否试过限制泛型方法? '公共PlaneRegion (移inShift)其中T:IEdge' – 2014-09-30 18:58:44

+0

我想'IEdge'有一个'Shift'方法,你应该在'PlanBoundaries'每个项目,而不是名单本身上调用。如果是这样的话@YuvalItzchakov对于如何处理它是正确的,这样你就不需要重写'Polygon'和'NonPolygon'类中的'Shift'。 – juharr 2014-09-30 19:07:47

回答

1

您可以缩小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)); 
}