在自定义代码

时间:2015-06-16 13:53:09

标签: oop

原始问题与C#有关,但几乎所有强类型编程语言开发人员都会理解。

我有来自不同第三方库的2个班级。我们说Location1Location2。它们都是密封的,具有相同类型的LatitudeLongitude属性 我编写了自定义类(比如Clusterizer),其中包含使用地理点的方法。两个外部库的逻辑相同,我的类对于两个位置类都应该是可接受的。对于获得单个lat / long参数对的方法,一切正常。例如:

var point = ...
Clusterizer.AddToCluster(point.Latitude, point.Longitude);

问题在于收藏。我想写这样的方法:

Clusterizer.AddClusters(points);

int index = Clusterizer.CalculateClusterIndex(points);

关键点:

  1. 我不想为Location1Location2创建2个重载。对于这两个班级,最好继续使用单一方法。
  2. 我希望这两个位置类都实现相同的界面(比如ILocation表示LatLon属性),但它们当然不是。
  3. 我无法创建派生类并实现自定义ILocation,因为原始类是sealed
  4. 我更倾向于使用位置类的单Clusterizer实现,因为两者的逻辑相同。
  5. 我还想避免创建包装类或我自己的Location类,因为创建新集合并转换回来是相当昂贵的。
  6. 我的一个想法是做这样的事情:

    public void AddToCluster<T>(IEnumerable<T> points,
        Func<T, double> latitudeGetter,
        Func<T, double> longitudeGetter)
    {
    }
    

    但使用它太难看了:

    AddToCluster(points, x => x.Latitude, x => x.Longitude);
    

    你对我的问题有更好的想法吗?

0 个答案:

没有答案