我有一个班级:
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
我认为这不足以超载方法(正确)
我如何识别物体?
答案 0 :(得分:6)
首先,您可以简化两种方法:
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
,然后应用自己的逻辑。
Derived1
的两个LangId
实例与AbstractDictionaryObject
相同,Derived2
的两个实例也是如此 - 但它们会有所不同因为他们有不同的类型。
如果您想为他们提供不同的哈希码,可以将GetHashCode()
更改为:
public override int GetHashCode()
{
int hash = 17;
hash = hash * 31 + GetType().GetHashCode();
hash = hash * 31 + LangId;
return hash;
}
但是,不同对象的哈希码不会 不同......它只是有助于提高性能。如果您知道将具有相同LangId
的不同类型的实例,则可能需要执行此操作,否则我不会打扰。