我有一堂课:

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


但是到那时应该没问题。如果这两个派生类具有其他字段,则它们应自己覆盖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的不同类型的实例,则可能需要执行此操作,否则我不会打扰。

09-10 07:31
查看更多