0

我正在使用两个不同的库,每个库都有自己的类型。两种类型都有 x 和 y 坐标,而每一种都有一些特殊字段。我想将这两种类型(比如PointAPointB)存储在一个列表中。我不能使用基类,因为PointAandPointB是库类型,不能修改。

有一个东西我必须在一个列表(一个点数组)中实际使用一个列表。我从Library1调用的方法返回List<PointA>,而 library2 的方法返回List<PointB>.

将这些点数组存储在一个列表中的最佳方法是什么?使用List<List<Object>>返回数组中的每个对象并将其转换为 Object?似乎这可以更优雅地完成。

4

2 回答 2

1

我只能想到一种可能的解决方案。创建自己的“包装器”类来处理类型统一/转换(未经测试):

class StoredPoint {
    PointA pa;
    PointB pb;

    public StoredPoint (PointA other) {
        pa = other;
        // pb is null
    }

    public StoredPoint (PointB other) {
        pb = other;
        // pa is null
    }

    public static implicit operator StoredPoint(PointA other) {
        return new StoredPoint(other);
    }

    public static implicit operator StoredPoint(PointB other) {
        return new StoredPoint(other);
    }

    public static implicit operator PointA(StoredPoint point) {
        if (pa != null)
            return pa;
        return PointA(0,0); // some default value in case you can't return null
    }

    public static implicit operator PointA(StoredPoint point) {
        if (pa != null)
            return pa;
        return PointA(0,0); // some default value in case you can't return null
    }

    public static implicit operator PointB(StoredPoint point) {
        if (pb != null)
            return pb;
        return PointB(0,0); // some default value in case you can't return null
    }
  }

然后,您可以使用创建一个列表List<StoredPoint>并将这两种类型的点添加到其中。您是否能够使用结果列表是一些不同的问题(主要是由于错误处理等)。

于 2013-11-15T10:14:46.647 回答
0

ArrayList您可以只使用库中的非泛型System.Collections

但更好的选择可能是您创建自己的点类并将PointAPointB对象转换为它。

例如,假设您定义了自己的类型 PointList:

public class PointList : List<MegaPoint>

MegaPoint您自己对点的定义在哪里)。

所以列表中的每一项都保证是 type MegaPoint。然后,如果要添加其他类型的列表,请实现以下方法:

public void AddFrom(List<PointA> points)

public void AddFrom(List<PointB> points)

它不只是添加项目,而是将它们转换为您的“通用” MegaPoint

现在,您的代码可以根据需要使用这些库,但您的 List 将始终包含一个类型,MegaPoint,其中包含适用于您的应用程序的正确属性。

于 2013-11-15T10:07:25.210 回答