原始问题与C#有关,但几乎所有强类型编程语言开发人员都会理解。
我有来自不同第三方库的2个班级。我们说Location1
和Location2
。它们都是密封的,具有相同类型的Latitude
和Longitude
属性
我编写了自定义类(比如Clusterizer
),其中包含使用地理点的方法。两个外部库的逻辑相同,我的类对于两个位置类都应该是可接受的。对于获得单个lat
/ long
参数对的方法,一切正常。例如:
var point = ...
Clusterizer.AddToCluster(point.Latitude, point.Longitude);
问题在于收藏。我想写这样的方法:
Clusterizer.AddClusters(points);
或
int index = Clusterizer.CalculateClusterIndex(points);
关键点:
Location1
和Location2
创建2个重载。对于这两个班级,最好继续使用单一方法。ILocation
表示Lat
和Lon
属性),但它们当然不是。ILocation
,因为原始类是sealed
。Clusterizer
实现,因为两者的逻辑相同。Location
类,因为创建新集合并转换回来是相当昂贵的。我的一个想法是做这样的事情:
public void AddToCluster<T>(IEnumerable<T> points,
Func<T, double> latitudeGetter,
Func<T, double> longitudeGetter)
{
}
但使用它太难看了:
AddToCluster(points, x => x.Latitude, x => x.Longitude);
你对我的问题有更好的想法吗?