IEquatable实现和运算符覆盖

Dav*_*New 2 .net c# inheritance abstract-class iequatable

域类T可以是以下类型ValueObject<T>:

public class Coordinate: ValueObject<Coordinate>
{ ... }
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

类中的Equals实现Coordinate:

public class Coordinate : ValueObject<Coordinate>
{
    // ...

    public override bool Equals(Coordinate other)
    {
        return (other != null) && (this.Latitude == other.Latitude) && (this.Longitude == other.Longitude);
    }
}
Run Code Online (Sandbox Code Playgroud)

ValueObject<T> 为==(以及for = =,未在上面显示)提供通用操作覆盖,适用于所有具体实现.

问题是,当Equals从== override重写方法时,它会调用Object.Equals()而不是Coordinate.Equals().

Eri*_*ert 6

问题是,当Equals==覆盖中调用该方法时,它会调用Object.Equals()而不是Coordinate.Equals().

不,问题在于那些事情是不同的.如果它们是相同的,那么就没有问题了.

所以让他们一样.不要让派生类做错事; 强迫他们做正确的事.

public abstract class ValueObject<T> : IEquatable<T>
{
    // Force the derived class to override these.
    public abstract override bool Equals(object obj);
    public abstract override int GetHashcode(object obj);

    // And then consistently use the overridden method as the implementation.
    public virtual bool Equals(T obj)
    {
        return obj1.Equals((object)obj2);
    }
    public static bool operator ==(ValueObject<T> obj1, ValueObject<T> obj2)
    {
         return obj1.Equals((object)obj2);
    }
    public static bool operator !=(ValueObject<T> obj1, ValueObject<T> obj2)
    {
         return !obj1.Equals((object)obj2);
    }
}
Run Code Online (Sandbox Code Playgroud)