我有一堂课:
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
{...}
In the 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
and Equals
他们自己,首先打电话base.Equals
or base.GetHashCode
然后应用他们自己的逻辑。
两个实例Derived1
与相同的LangId
就等价于AbstractDictionaryObject
是有关的,两个实例也是如此Derived2
- 但它们会彼此不同,因为它们有不同的类型。
如果你想给他们不同的哈希码你could change GetHashCode()
to:
public override int GetHashCode()
{
int hash = 17;
hash = hash * 31 + GetType().GetHashCode();
hash = hash * 31 + LangId;
return hash;
}
然而,不同对象的哈希码并不相同have与众不同……这只会有助于提高性能。如果您了解自己,您可能会想要这样做will具有相同类型的不同类型的实例LangId
,但否则我不会打扰。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)