С одной стороны, вы можете упростить оба ваших метода:
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
, но в противном случае я бы не стал беспокоиться.