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().
问题是,当
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)