Получить хеш-код родительского класса из унаследованного класса - PullRequest
0 голосов
/ 02 февраля 2011

Рассмотрим эти классы:

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 из InheritedClass и сохранить создание нового BaseClass из свойств объекта, есть ли способ получить нужный мне HashCode?

Ответы [ 5 ]

3 голосов
/ 02 февраля 2011

Отдельные объекты имеют HashCode.

И пока вы не переопределите GetHashCode(), значение полностью не зависит от класса (базового или производного) объекта.

1 голос
/ 02 февраля 2011

Добавить этот метод в InheritedClass:

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

Затем вызвать iX.GetBaseHashCode();

Примечание: Я предполагаю, что вы переопределяете GetHashCode() для InheritedClass.Потому что в противном случае они вернут точно такое же значение.

1 голос
/ 02 февраля 2011

Хеш-код для экземпляра чего-либо будет одинаковым независимо от того, как вы его разыгрываете.Независимо от того, как вы «просматриваете» его, вы все равно смотрите на тот же объект в памяти.Единственный способ, которым я могу придумать, - это клонировать его как базовый тип (чтобы у вас был фактический экземпляр базового класса), а затем хешировать его.

0 голосов
/ 02 февраля 2011

Нет, если вы не предоставите такой метод в своем унаследованном классе. То, что вы разыгрываете что-то, не означает, что это меняет личность. Кроме того, что если у вас есть два экземпляра, которые имеют тот же хеш-код, что и базовый класс, но отличаются от наследуемого, так как поле / свойство изменилось?

0 голосов
/ 02 февраля 2011

Поскольку ни один из ваших классов не переопределяет GetHashCode, они будут использовать реализацию по умолчанию, предоставленную System.Object.

Хеш-код генерируется для объекта , поэтому хеш-код, сгенерированный для bX, одинаков независимо от того, рассматривается ли он как родительский класс или дочерний класс, поскольку такая же реализация GetHashCode б.

Если бы у каждого класса было свое собственное переопределение GetHashCode, тогда эти переопределения будут использоваться, как вы ожидаете, при вызове parent.GetHashCode или child.GetHashCode и т. Д.

...