gpt4 book ai didi

c# - IEquatable 实现和运算符覆盖

转载 作者:行者123 更新时间:2023-11-30 20:00:00 25 4
gpt4 key购买 nike

域类 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() .

最佳答案

The problem is that when the Equals method is called from either the == override, it calls Object.Equals() and not 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);
}
}

关于c# - IEquatable 实现和运算符覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22424822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com