我大致有以下类型层次结构,(我知道NonPolygon上的所有边都不是弧。
我试图对所有PlaneRegions进行挤压,导致返回Solid对象。当我挤出一个多边形时,我想返回一个多面体。当我返回NonPolygon时,我想返回一个NonPolyhedron,它也是一个实体。
public class PlaneRegion
{
public IEnumerable<IEdge> Edges;
public virtual Solid Extrude()
{
throw new NotImplementedException();
}
}
我使用两个派生类扩展上面的类,这些派生类使用不同的IEdge派生类型作为边缘。我还想让他们的拉伸方法返回Solid对象的不同派生。
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方法,因为我有&#34;不同&#34;返回类型。从派生类型的函数返回派生类型的适当方法是什么? (如果有办法?)
答案 0 :(得分:0)
使用Solid的共享基本类型作为返回值,而不是Polyhedron。毕竟,基本的Extrude方法不知道或关心返回的是Polyhedron还是NonPolyhedron。请注意,您仍然返回一个Polyhedron对象...它只是调用者将对象作为实体获取。它可以被调用者强制转换为多面体,如果由于某种原因它会关心(但通常如果你正确使用多态,它就不会)。
注意:在图表中,您有“Solid”继承“Solid”。我假设子类“Solid”应该是“NonPolyhedron”。