2014-10-20 4 views
0

Я примерно следующее Type Hierarchy, (я знаю, что все ребра на NonPolygon не будет дуги.ковариации с функциональными типами возврата

enter image description here

Я пытаюсь сделать EXTRUSIONS на всех PlaneRegions в результате вернулся из массива объектов. Когда я выдавить Polygon Я хочу вернуть многогранник. Когда я вернусь в NonPolygon, я хочу вернуть NonPolyhedron, который также является твердым.

public class PlaneRegion 
{ 
    public IEnumerable<IEdge> Edges; 

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

я продлить выше класс с двумя полученными классы t hat используют разные производные типы IEdge как Edges. И я также хотел бы, чтобы их методы выдавливания возвращали разные значения объектов 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() вместо производных реализаций классов. Я не могу переопределить метод Extrude в PlaneRegion, потому что у меня есть «разные» типы возврата. Каков подходящий способ возврата производного типа из функции в производном типе? (Если есть способ?)

ответ

0

Используйте общий базовый тип Solid как возвращаемое значение, а не многогранник. В конце концов, базовый метод Extrude не знает или не заботится о том, что возвращается: Polyhedron или NonPolyhedron. Обратите внимание, что вы все равно возвращаете объект Polyhedron & hellip, это просто, что вызывающий объект получает объект как Solid. Он может быть возвращен в Polyedron вызывающим, если по какой-то причине он заботится (но обычно, если вы используете полиморфизм правильно, он не будет).

Примечание: на вашей диаграмме у вас есть «Solid», наследующий «Solid». Я предполагаю, что подкласс «Solid» должен был быть «NonPolyhedron».

+0

Опечати прямо на заказ. – jth41

Смежные вопросы