3

我有一堂课:

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.
我认为这不足以重载方法(正确地)。
如何识别对象?

4

1 回答 1

7

一方面,您可以简化两种方法:

 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;
 }

但到那时应该没问题。如果两个派生类有其他字段,它们应该覆盖GetHashCodeEquals自己,首先调用base.Equalsbase.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,否则我不会打扰。

于 2011-08-10T05:31:48.413 回答