域类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);
}
}
Coordinate
类中的Equals实现:
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()
。
发布于 2014-03-15 22:22:41
当您说obj1.Equals(obj2)
时,obj2
的类型是ValueObject<T>
,它与public abstract bool Equals(T obj)
中的T
不匹配。
实际上,在运行时,它可以是与T
不同的类。
在这种情况下,您可能希望返回false。
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;
if (obj1.GetType() != obj2.GetType()) return false; //new
return ((T)(object)obj1).Equals((T)(object)obj2);
}
我认为您认为T
等同于ValueObject<T>
的派生类。你可以说where T : ValueObject<T>
。这至少编码了类型系统中所需内容的一部分,并为您节省了(object)
类型转换。
https://stackoverflow.com/questions/22424822
复制相似问题