3

これが私の現在のクラス図です:

ここに画像の説明を入力

ご覧のとおり、 と はどちらもとPolygonNonPolygon型です。ジェネリックなので、 for のいずれかのリストを作成して、orを持つことができるようにするか、 forのみにすることができます。以下は、実装方法を示すクラスのサンプルです。PlaneRegionLineSegmentIEdgePlaneRegionPlaneBoundariesIEdgeNonPolygonLineSegmentarcLineSegmentPolygon

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>追加できません。これは、コンパイル時にエラーが発生するコードの例です。PolygonPolygonPlaneRegion<LineSegment>LineSegmentIEdge

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)が、ずさんで安全ではないように見えるので、もっと良い方法があるはずです。

4

1 に答える 1