私はいくつかのクラスとインターフェースを持っています
public interface IGeoObject
{
GeoCoordinate GetGeocoordinate();
}
public class User : IGeoObject
{
public GeoCoordinate GetGeocoordinate()
{
//...
return GeoCoordinate;
}
}
public class Venue : IGeoObject
{
public GeoCoordinate GetGeocoordinate()
{
//...
return GeoCoordinate;
}
}
public class Place : IGeoObject
{
public GeoCoordinate GetGeocoordinate()
{
//...
return GeoCoordinate;
}
}
タイプの変数ユーザーの例がありますList<User>
そして、署名付きのメソッドがあります
double GetMinDistance(List<IGeoObject> objects, GeoCoordinate position)
GetMinDistance
ジェネリック型の共分散が機能しないため、ユーザーを に渡すことができません。
追加のリストを作成してメソッド.ConvertAll
(または.CasT<T>
)を使用できます。
List<IGeoObject> list = new List<User>(listUser).ConvertAll(x => (IGeoObject)x);
var dist = GeoTest.GetMinDistance(list, position);
これが最もエレガントなソリューションかどうかはわかりません。呼び出し元がこの変換を行わなければならないことは、最も恥ずかしいことです。
これは、アーキテクチャの問題に似ていますか? よりエレガントなソリューションはありますか?
PS長い話ですが、すべてのクラスで同じ種の座標を与えることはできません。