Изменение значений из производных классов - PullRequest
0 голосов
/ 11 августа 2011
class BaseClass
{
    public int Field = 1;
}
class DerivedA : BaseClass
{
    public int SetField6()
    {
        return this.Field = 6;
    }
}
class DerivedB : BaseClass
{
    public int SetField16()
    {
        return this.Field = 16;
    }
}

BaseClass x = new BaseClass();
int xField = x.Field;

DerivedA y = new DerivedA();
int yField = y.SetField6();

DerivedB z = new DerivedB();
int zField = z.SetField16();

int baseField = new BaseClass().Field;

В этом случае, когда значение Field изменяется в классах DerivedA и DerivedB, значение Field в классе BaseClass не изменяется.Таким образом, значение baseField по-прежнему 1.

  • Можно ли изменить значение Field в классе BaseClass из производного класса?
  • Есть ли шаблон проектирования для этого сценария и как он называется?

Ответы [ 4 ]

1 голос
/ 11 августа 2011

Во-первых, что может быть исправлением: измените нужное поле подклассами static в базовом классе. Я не уверен, действительно ли это даст вам ожидаемое поведение, потому что неясно, каково это поведение. Если вы сделаете это, каждый экземпляр будет иметь одинаковое значение.

Во-вторых, все это неясно, потому что (я думаю) вы путаете классы с экземплярами здесь.

Чтобы использовать для этого довольно распространенную метафору, это разница между планом дома и самим домом.

Вопрос, который вы только что задали: если я строю дом из чертежа Z и разбиваю окно в этом доме, почему в новом доме не разбиты окна, сделанные из того же чертежа?

Дом в этой метафоре - это экземпляр (x), план - это класс (BaseClass).

1 голос
/ 11 августа 2011

Когда вы создаете экземпляр каждого объекта, он создает свою собственную память в куче, пока не укоренится, т.е. в классе объектов. И все члены в каждом классе heirarchy создаются в стеке (если его тип значений).

Следовательно, в каждом конкретном случае он отличается.

0 голосов
/ 17 августа 2011

1. Можно ли изменить значение Field в классе BaseClass из производного класса?

Вы действительно сделали это в своем сценарии, но он скрыт последней строкой кода (потому что вы создаете экземпляр нового объекта, который получает новую настройку поля равной 1).Таким образом, вместо вызова:

 int baseField = new BaseClass().Field;

Используйте это:

 int baseField = y.Field; // baseField is now = 6 because Field was changed earlier by y.SetField6()

Таким образом, вы можете увидеть, что значение базового элемента Field было изменено объектом, созданным изпроизводный класс (фактическая модификация была сделана вызовом y.SetField6 ()).

2. Существует ли шаблон проектирования для этого сценария и как он называется?

Да, он называется наследование объекта.

0 голосов
/ 11 августа 2011

Вы можете сделать Field в BaseClass статическим, чтобы получить то, что вы хотите (хотя я действительно не могу понять, чего вы пытаетесь достичь)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...