我有一个类:
public abstract class AbstractDictionaryObject
{
public virtual int LangId { get; set; }
public override bool Equals(object obj)
{
if (obj == null || obj.GetType() != GetType())
{
return false;
}
AbstractDictionaryObject other = (AbstractDictionaryObject)obj;
if (other.LangId != LangId)
{
return false;
}
return true;
}
public override int GetHashCode()
{
int hashCode = 0;
hashCode = 19 * hashCode + LangId.GetHashCode();
return hashCode;
}
我有派生类:
public class Derived1:AbstractDictionaryObject
{...}
public class Derived2:AbstractDictionaryObject
{...}
在AbstractDictionaryObject
中只有一个公共域:LangId
。
我认为这不足以(正确地)重载方法。
我如何识别物体?
可以简化这两个方法:
public override bool Equals(object obj)
{
if (obj == null || obj.GetType() != GetType())
{
return false;
}
AbstractDictionaryObject other = (AbstractDictionaryObject)obj;
return other.LangId == LangId;
}
public override int GetHashCode()
{
return LangId;
}
但是在那一点上它应该是好的。如果两个派生类有其他字段,它们应该覆盖GetHashCode
和Equals
自己,首先调用base.Equals
或base.GetHashCode
,然后应用自己的逻辑。
两个具有相同LangId
的Derived1
实例就AbstractDictionaryObject
而言是等价的,两个Derived2
实例也是等价的——但是它们将彼此不同,因为它们具有不同的类型。
如果你想给他们不同的哈希码,可以改变GetHashCode()
为:
public override int GetHashCode()
{
int hash = 17;
hash = hash * 31 + GetType().GetHashCode();
hash = hash * 31 + LangId;
return hash;
}
然而,不同对象的哈希码并不要求是不同的…它只是对性能有帮助。如果您知道将具有相同LangId
的不同类型的实例,您可能想要这样做,但否则我不会麻烦。