2014-10-20 135 views
0

我已经大致有以下几种类型层次,(我知道,在一个NonPolygon所有边缘不会弧线。协方差与函数返回类型

enter image description here

我试图做导致所有PlaneRegions型材返回固体对象。当我挤出多边形欲返回一个多面体。当我返回一个NonPolygon,我想返回一个NonPolyhedron,这也是一个固体。

public class PlaneRegion 
{ 
    public IEnumerable<IEdge> Edges; 

    public virtual Solid Extrude() 
    { 
     throw new NotImplementedException(); 
    } 
} 

I与两种衍生延伸上面的类类t帽子使用IEdge的不同派生类型作为边缘。我想也有他们的挤压方法返回固体对象的不同派生。

public class Polygon: PlaneRegion 
{ 

    public Polygon(List<LineSegment> passedSegments) 
    { 
     this.Edges = passedSegment; 
    } 

    public new Polyhedron Extrude() 
    { 
     List<LineSegment> segments = Edges as List<LineSegment>; 

     foreach (var segment in segments) 
     { 
      //do stuff 
     } 

     return new Polyhedron(new List<Polygon>(){ this}); 
    } 
} 

public class NonPolygon: PlaneRegion 
{ 

    public NonPolygon(List<Arc> passedArcs) 
    { 
     this.Edges = passedArcs; 
    } 

    public new NonPolyhedron Extrude() 
    { 
     foreach (var arc in Edges as List<Arc>) 
     { 
      //do stuff 
     } 

     return new NonPolyhedron(new List<NonPolygon>(){this}); 
    } 
} 

当我尝试下面的代码时,我调用PlaneRegion Extrude()而不是派生类实现的实现。我无法重写PlaneRegion中的Extrude方法,因为我有“不同的”返回类型。从派生类型的函数返回派生类型的适当方式是什么? (如果有方法?)

回答

0

使用Solid的共享基本类型作为返回值,而不是Polyhedron。毕竟,基础挤出方法不知道或不在乎返回的是多面体还是非多面体。请注意,您仍然返回一个Polyhedron对象&hellip;它只是调用者将对象作为一个Solid获取。如果由于某种原因,它可以被调用者抛弃回多面体(但通常如果你正确地使用多态性,它不会)。

注意:在你的图中,你有“固体”继承“固体”。我假设“Solid”子类应该是“NonPolyhedron”。

+0

哎呀,你错了。 – jth41 2014-10-20 17:45:10