Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在自定义代码中使用同类第三方类_Oop - Fatal编程技术网

Oop 在自定义代码中使用同类第三方类

Oop 在自定义代码中使用同类第三方类,oop,Oop,最初的问题与C#有关,但几乎所有强类型编程语言开发人员都会理解 我有两个来自不同第三方库的类。比如说Location1和Location2。它们都是密封的,并且具有相同类型的纬度和经度属性。 我编写自定义类(比如说Clusterizer),其中包含处理地理点的方法。这两个外部库的逻辑是相同的。两个location类都应该可以接受my类。对于获得单个lat/long参数对的方法,一切都正常。例如: var point = ... Clusterizer.AddToCluster(point.Lat

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

我有两个来自不同第三方库的类。比如说
Location1
Location2
。它们都是密封的,并且具有相同类型的
纬度
经度
属性。
我编写自定义类(比如说
Clusterizer
),其中包含处理地理点的方法。这两个外部库的逻辑是相同的。两个location类都应该可以接受my类。对于获得单个
lat
/
long
参数对的方法,一切都正常。例如:

var point = ...
Clusterizer.AddToCluster(point.Latitude, point.Longitude);
问题在于集合。我想编写这样调用的方法:

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

要点:

  • 我不想为
    Location1
    Location2
    创建2个重载。对于这两个类,最好都使用单一方法
  • 我希望两个location类实现相同的接口(比如说
    ILocation
    ,带有
    Lat
    Lon
    属性),但它们当然没有
  • 我无法创建派生类并实现自定义
    ILocation
    ,因为原始类是
    密封的
  • 对于location类,我更喜欢使用单个
    集群化器
    实现,因为两者的逻辑是相同的
  • 我还希望避免创建包装类或我自己的
    Location
    类,因为创建一个新集合并将其转换回比较昂贵
  • 我的一个想法是这样做:

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

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

    为什么不创建2个重载?对我来说,这听起来是迄今为止最简单的方法。@JonSkeet smth喜欢
    M1(Loc1)
    M2(Loc2)
    方法调用公共的
    M(loc.Lat,loc.Lon)
    ?是的,可能-尽管我可能会给消息起相同的名字。您可以让这些方法的实现在最后使用该思想,使用函数。。。