从继承的类中获取父类的哈希码

时间:2011-02-02 15:44:31

标签: c# inheritance hashcode

考虑这些课程:

public class BaseClass {
    public int SomeInt { get; set; }
    public bool SomeBool { get; set; }

    public BaseClass(int i, bool b) {
        SomeInt = i;
        SomeBool = b;
    }
}

public class InheritedClass : BaseClass {
    public List<Int32> SomeInts { get; set; }

    public InheritedClass(int i, bool b, List<Int32> ints): base(i, b) {
        SomeInts = ints;
    }

    public InheritedClass(BaseClass b, List<Int32> ints) : base(b.SomeInt, b.SomeBool) {
        SomeInts = ints;
    }
}

我有一个InheritedClass的实例,我希望得到它的HashCode值,如果它是BaseClass。我试过去投它:

BaseClass x = new BaseClass(10, true);
Console.WriteLine("HashCode x: {0}", x.GetHashCode());
InheritedClass iX = new InheritedClass(x, new List<int> { 1, 2, 3 });
Console.WriteLine("HashCode iX: {0}", iX.GetHashCode());
BaseClass bX = (BaseClass)iX;
//I've also tried:
//BaseClass bX = ix as BaseClass;
Console.WriteLine("Base HashCode bX: {0}", bX.GetHashCode());

但是最后的WriteLine正在返回哈希码,好像它是InhertiedClass一样。我无法覆盖GetHashCode的{​​{1}},并保存从对象的属性构造新的InheritedClass,无论如何都要获得我需要的HashCode?

5 个答案:

答案 0 :(得分:3)

单个对象具有HashCode。

只要您不覆盖GetHashCode(),该值就完全独立于对象的类(Base或Derived)。

答案 1 :(得分:1)

无论你如何投射,任何事物实例的哈希码都是相同的。无论你如何“观察”它,你仍然在寻找记忆中的同一个物体。我能想到的唯一方法是将它克隆为基类型(因此你有一个基类的实际实例),然后哈希它。

答案 2 :(得分:1)

将此方法添加到InheritedClass:

public class InheritedClass : BaseClass {
    public int GetBaseHashCode()
    {
         return base.GetHashCode();
    }
}

然后拨打iX.GetBaseHashCode();

注意:我假设您正在覆盖GetHashCode()的{​​{1}}。因为否则这些将返回完全相同的值。

答案 3 :(得分:0)

由于您的任何一个类都不会覆盖GetHashCode,因此它们将使用System.Object提供的默认实现。

对象生成哈希码,因此为bX生成的哈希码是相同的,无论它是被视为父类还是子类,因为{的相同实现{使用{1}}。

如果每个类都有自己的GetHashCode覆盖,则在调用GetHashCodeparent.GetHashCode等时,将按预期使用这些覆盖。

答案 4 :(得分:0)

不,除非您在继承的类中提供这样的方法,否则没有。仅仅因为你投了一些东西并不意味着它的身份变化。另外,如果你有两个实例,它们与基类具有相同的哈希码,但是随着字段/属性的改变而继承,那会怎样?