none
Сохраняются ли значения полей объекта производного класса после присваивания его объекту базового класса RRS feed

  • Вопрос

  • Говорим о ссылочных типах. Есть базовый класс X

    class X
    {
      int _a;
      int _b;
    }

    Есть производный от него класс Y

    class Y : X
    {
       double c;
    }

    Есть коллекция

    ObservableCollection coll<X> = new ObservableCollection<X>();

    Затем, в коде программы я делаю:

    for(int i = 0; i < 4; i++)
    {
          Y vY = new Y();
          vY.a = 1;
          vY.b = 2;
          vY.c = 2.5 + (double)i;
          coll.Add(vY);
    }

    Затем если я напишу:

    bool f_Check = false;
    
    for(int i = 0; i < coll.Count; i++)
    {
        Y mY = ((Y)coll[i]);
        if(mY.c == (2.5 + (double)i))
            f_Check = true;
        else
            f_Check = false;
    }

    то у меня в данном случае, при работе цикла, f_Check всегда будет устанавливаться в true или нет? Т.е. Более конкретно - при обратном преобразовании (из X в Y) элементов, получаемых из коллекции сохраниться то значение поля Y.c, которое было присвоено перед помещением коллекцию?

    5 июля 2013 г. 13:21

Ответы

  • Значение поля Y.c сохранится (поля должны public).

    По поводу сравнения, лучше делать так:

    for (int i = 0; i < coll.Count; i++)
    {
        Y mY = ((Y)coll[i]);
        if (Math.Abs(mY.c - (2.5 + (double)i)) < Double.Epsilon)
            f_Check = true;
        else
            f_Check = false;
    }
    

    • Помечено в качестве ответа TownSparrow 6 июля 2013 г. 6:15
    • Снята пометка об ответе TownSparrow 6 июля 2013 г. 6:15
    • Помечено в качестве ответа TownSparrow 6 июля 2013 г. 6:36
    5 июля 2013 г. 19:18

Все ответы

  • Значение поля Y.c сохранится (поля должны public).

    По поводу сравнения, лучше делать так:

    for (int i = 0; i < coll.Count; i++)
    {
        Y mY = ((Y)coll[i]);
        if (Math.Abs(mY.c - (2.5 + (double)i)) < Double.Epsilon)
            f_Check = true;
        else
            f_Check = false;
    }
    

    • Помечено в качестве ответа TownSparrow 6 июля 2013 г. 6:15
    • Снята пометка об ответе TownSparrow 6 июля 2013 г. 6:15
    • Помечено в качестве ответа TownSparrow 6 июля 2013 г. 6:36
    5 июля 2013 г. 19:18
  • Спасибо большое, Кирилл. Вы пишете "поля должны public". Ведь это, как я понимаю, касается только присвоения им значений (полям классов X  и Y). Я извиняюсь - просто забыл вчера указать соответствующие модификаторы доступа к полям классов X и Y.


    • Изменено TownSparrow 6 июля 2013 г. 6:35 Поправил