2011-02-02 48 views
0

考慮這些類:獲取父類的散列碼

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一個例子,我想它的哈希碼值,如果它是一個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。我無法覆蓋的InheritedClass,並保存構建一個新的BaseClass從對象的屬性,有無論如何得到我需要的HashCode?

回答

1

無論你如何施放它,任何事物的哈希碼都是相同的。不管你如何「觀察」它,你仍然在看內存中的同一個對象。我能想到的唯一方法就是將其作爲基本類型克隆(因此您有一個基類的實際實例),然後對其進行哈希處理。

3

單個對象有一個HashCode。

只要您不覆蓋GetHashCode(),該值完全獨立於對象的類(基本或派生)。

0

由於您的任何類都不會覆蓋GetHashCode,因此他們將使用System.Object提供的默認實現。對於對象產生

的哈希碼,所以bX產生的哈希碼是一樣的,不管它是否會被視爲父類或子類,由於使用相同的實現的GetHashCode

如果每個類都有自己的GetHashCode覆蓋然後像您期望的調用parent.GetHashCodechild.GetHashCode

1

當此方法添加到InheritedClass那些覆蓋將用於:

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

然後調用iX.GetBaseHashCode();

注意:我假設你重寫GetHashCode()InheritedClass。因爲否則這些將返回完全相同的值。

0

不,除非你在繼承的類中提供這樣的方法,否則不會。僅僅因爲你投了些東西並不意味着它就是身份的變化。另外,如果您有兩個實例,它們與基類具有相同的散列碼,但與繼承的不同,因爲字段/屬性更改?