考虑这些课程:
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? p>
答案 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
覆盖,则在调用GetHashCode
或parent.GetHashCode
等时,将按预期使用这些覆盖。
答案 4 :(得分:0)
不,除非您在继承的类中提供这样的方法,否则没有。仅仅因为你投了一些东西并不意味着它的身份变化。另外,如果你有两个实例,它们与基类具有相同的哈希码,但是随着字段/属性的改变而继承,那会怎样?