我有一堂课:
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
,然后应用自己的逻辑。就
Derived1
而言,具有相同LangId
的两个AbstractDictionaryObject
实例将是等效的,并且Derived2
的两个实例也将等效-但它们由于类型不同而彼此不同。如果您想给他们不同的哈希码,可以将
GetHashCode()
更改为: public override int GetHashCode()
{
int hash = 17;
hash = hash * 31 + GetType().GetHashCode();
hash = hash * 31 + LangId;
return hash;
}
但是,不同对象的哈希码不必相同……这只会提高性能。如果您知道将拥有具有相同
LangId
的不同类型的实例,则可能需要执行此操作,否则我不会打扰。