2014-10-20 111 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