Список родового типизированного родителя, не принимающего дочерний элемент с типом, который является подтипом типа родительского списка
Вот моя текущая диаграмма классов:
Как видите, оба 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;
}