2011-02-02 5 views
0

hérité Tenir compte de ces classes:Obtenez hashcode de classe parente de la classe

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

Et j'ai une instance de InheritedClass, je veux obtenir la valeur de HashCode de celui-ci si elle était un BaseClass. Je l'ai essayé le jeter:

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()); 

Mais la WriteLine finale renvoie le hashcode comme si elle était un InhertiedClass. Je ne peux pas dépasser le GetHashCode du InheritedClass, et enregistrer la construction d'un nouveau BaseClass à partir des propriétés de l'objet, y at-il de toute façon pour obtenir le HashCode dont j'ai besoin?

Répondre

1

Le hashcode d'une instance de n'importe quoi sera le même, peu importe comment vous l'avez lancé. Indépendamment de la façon dont vous le «visualisez», vous regardez toujours le même objet en mémoire. La seule façon dont je peux penser à faire ceci est de le cloner comme le type de base (donc vous avez une instance réelle de la classe de base) et ensuite le hacher.

3

Les objets individuels ont un code HashCode. Et aussi longtemps que vous ne surchargez pas GetHashCode(), la valeur est totalement indépendante de la classe (Base ou Dérivée) de l'objet

0

Comme aucune de vos classes ne remplace GetHashCode, il utilise l'implémentation par défaut fournie par System.Object.

Le hashcode est généré pour l'objet , de sorte que le hashcode généré pour bX est le même, peu importe que ce soit traité comme la classe parente ou une catégorie d'enfants, depuis la mise en œuvre de même GetHashCode est utilisé.

Si chaque classe avait son propre GetHashCode override alors ces remplacements serait utilisé comme prévu lors de l'appel parent.GetHashCode ou child.GetHashCode etc.

1

Ajouter cette méthode pour InheritedClass:

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

Ensuite, appelez iX.GetBaseHashCode();

Remarque: Je suppose que vous remplissez GetHashCode() pour InheritedClass. Parce que sinon, ils retourneront exactement la même valeur.

0

Non, sauf si vous fournissez une telle méthode dans votre classe héritée. Juste parce que vous jetez quelque chose ne veut pas dire que ce sont des changements d'identité. Aussi, que se passe-t-il si vous avez deux instances, qui ont le même hashcode que la baseclass, mais qui sont différentes de celles héritées, comme un champ/propriété a changé?

Questions connexes