函数返回类型的协方差

时间:2014-10-20 17:24:17

标签: c# inheritance override covariance contravariance

我大致有以下类型层次结构,(我知道NonPolygon上的所有边都不是弧。

enter image description here

我试图对所有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;返回类型。从派生类型的函数返回派生类型的适当方法是什么? (如果有办法?)

1 个答案:

答案 0 :(得分:0)

使用Solid的共享基本类型作为返回值,而不是Polyhedron。毕竟,基本的Extrude方法不知道或关心返回的是Polyhedron还是NonPolyhedron。请注意,您仍然返回一个Polyhedron对象...它只是调用者将对象作为实体获取。它可以被调用者强制转换为多面体,如果由于某种原因它会关心(但通常如果你正确使用多态,它就不会)。

注意:在图表中,您有“Solid”继承“Solid”。我假设子类“Solid”应该是“NonPolyhedron”。