これが私の現在のクラス図です:
ご覧のとおり、 と はどちらもとPolygon
のNonPolygon
型です。ジェネリックなので、 for のいずれかのリストを作成して、orを持つことができるようにするか、 forのみにすることができます。以下は、実装方法を示すクラスのサンプルです。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
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)
が、ずさんで安全ではないように見えるので、もっと良い方法があるはずです。