域类T
可以是类型ValueObject<T>
:
public class Coordinate: ValueObject<Coordinate>
{ ... }
ValueObject<T>
实现IEquatable
接口。我希望 的每个具体实现都ValueObject<T>
为 提供实现bool Equals(T obj)
,因此我将其创建为抽象方法:
public abstract class ValueObject<T> : IEquatable<T>
{
public abstract bool Equals(T obj);
public static bool operator ==(ValueObject<T> obj1, ValueObject<T> obj2)
{
if (object.ReferenceEquals(obj1, obj2)) return true;
if (object.ReferenceEquals(obj1, null)) return false;
if (object.ReferenceEquals(obj2, null)) return false;
return obj1.Equals(obj2);
}
}
类中的 Equals 实现Coordinate
:
public class Coordinate : ValueObject<Coordinate>
{
// ...
public override bool Equals(Coordinate other)
{
return (other != null) && (this.Latitude == other.Latitude) && (this.Longitude == other.Longitude);
}
}
ValueObject<T>
为 ==(和 !=,上面未显示)提供通用操作覆盖,适用于所有具体实现。
问题是,当Equals
从 == 覆盖调用该方法时,它调用Object.Equals()
而不是Coordinate.Equals()
.