I can’t see any point in having an interface for this, to be honest.
I would just create a struct, but make it immutable – mutable structs are a really bad idea. I’d also use full Latitude
and Longitude
as the property names. Something like this:
public struct GeoCoordinate
{
private readonly double latitude;
private readonly double longitude;
public double Latitude { get { return latitude; } }
public double Longitude { get { return longitude; } }
public GeoCoordinate(double latitude, double longitude)
{
this.latitude = latitude;
this.longitude = longitude;
}
public override string ToString()
{
return string.Format("{0},{1}", Latitude, Longitude);
}
}
I’d then also implement IEquatable<GeoCoordinate>
and override Equals
and GetHashCode
, e.g.
public override bool Equals(Object other)
{
return other is GeoCoordinate && Equals((GeoCoordinate) other);
}
public bool Equals(GeoCoordinate other)
{
return Latitude == other.Latitude && Longitude == other.Longitude;
}
public override int GetHashCode()
{
return Latitude.GetHashCode() ^ Longitude.GetHashCode();
}
Note that you need to be aware of the normal dangers of performing equality comparisons on doubles – there’s not much alternative here, but two values which look like they should be equal may not be…
The point about the parameterless constructor is a reasonable one, but I suspect you’ll find it won’t actually bite you.