Список родового типизированного родителя, не принимающего дочерний элемент с типом, который является подтипом типа родительского списка

Вот моя текущая диаграмма классов:

введите описание изображения здесь

Как видите, оба Polygon а также NonPolygon типы PlaneRegion а также LineSegment инвентарь IEdge.Отель PlaneRegion является общим, поэтому мы можем сделать его список PlaneBoundaries или IEdge за NonPolygon так что может иметь LineSegment или же arcили так, что они могут быть только LineSegment за Polygon, Ниже приведены примеры классов, чтобы показать, как это реализовано:

public class PlaneRegion<T> : Plane, where T : IEdge
{
    public virtual List<T> PlaneBoundaries { get; set; }
}

public class Polygon : PlaneRegion<LineSegment>
{
    #region Fields and Properties
    public override List<LineSegment> PlaneBoundaries
    {
        get { return _planeBoundaries; }
        set { _planeBoundaries = value; }
    }
    protected List<LineSegment> _planeBoundaries;
}

public class NonPolygon : PlaneRegion<IEdge>
{
    public override List<IEdge> PlaneBoundaries
    {
        get { return _planeBoundaries; }
        set { _planeBoundaries = value; }
    }
    private List<IEdge> _planeBoundaries;
}

Это все отлично работает, но когда я пытаюсь составить список PlaneRegion<IEdge> это не позволит мне добавить Polygon возражать против списка, несмотря на Polygon быть PlaneRegion<LineSegment> а также LineSegment implemting IEdge, Это пример кода, который дает мне ошибку во время компиляции:

List<PlaneRegion<IEdge>> planes = new List<PlaneRegion<IEdge>>();

Polygon polygon1 = new Polygon();      
NonPolygon nonPolygon1 = new NonPolygon();

planes.Add(polygon1); //says that .Add() has some invalid arguments
planes.Add(nonPolygon1);

Есть ли способ добавить polygon1 к этому списку, который является безопасным типом? Я пробовал кастинг polygon1 печатать PlaneRegion<IEdge> но это дало ошибку компиляции, что он не может конвертировать типы. Я знаю, что могу сделать (PlaneRegion<IEdge>)(object) но это кажется небрежным и небезопасным, так что, кажется, должен быть лучший путь.

1 ответ

Попробуйте это, у меня это отлично работает:

public class Polygon : PlaneRegion<IEdge> 
{
    public new List<LineSegment> PlaneBoundaries
    {
        get { return (_planeBoundaries); }
        set { _planeBoundaries = value; }
    }
    protected List<LineSegment> _planeBoundaries;
}
Другие вопросы по тегам