Обновление объекта в дочернем классе, не обновляет объект внутри List <T>в базовом классе - PullRequest
0 голосов
/ 03 марта 2012

У меня есть следующие классы:

public class DrawableComplexEntity2D
{
    public List<GameComponent> Components { get; set; }

    // anothers properties, constructor, methods...
}

public class BoardCell : DrawableComplexEntity2D
{
    public GoalPersonGroup GoalPersonGroup { get; set; }

    public void CreateGoalPersonGroup(Goal groupType)
    {
        this.GoalPersonGroup = new GoalPersonGroup(groupType)
        base.Components.Add(this.GoalPersonGroup);
    }
}

Итак, когда я делаю:

BoardCell cell1 = new BoardCell();
cell1.CreateGoalPersonGroup(Goal.Type1);

BoardCell cell2 = new BoardCell();
cell2.CreateGoalPersonGroup(Goal.Type2);

cell1.GoalPersonGroup = cell2.GoalPersonGroup;

Когда я обновляю cell1.GoalPersonGroup с помощью cell2.GoalPersonGroup, cell1.GoalPersonGroup будетобновлено, но cell1.GoalPersonGroup, которая находится внутри base.Components of cell1, не изменяется и все равно значение cell1 вместо cell2.Почему?

Ответы [ 3 ]

2 голосов
/ 03 марта 2012

Да, вы путаетесь со ссылками.Присвоение ссылочной переменной назначает объект, на который ссылаются.

например,

string str1 = new String("Hello");   //str1 has a reference to "Hello"
string basestr = str1;               //basestr has a reference to "Hello" (NOT str1)

string str2 = new String("Goodbye"); //str2 has a reference to "Goodbye"
str1 = str2;                         //str1 has a reference to "Goodbye" (basestr still = hello)
1 голос
/ 03 марта 2012

Списки, как и все остальные переменные, содержат значения .С типом ссылки (который я предполагаю GoalPersonGroup), значение является ссылкой .Если у меня есть следующее:

object a = ...;
object b = ...;

a = b;

Все, что я сделал, это взял значение из b (которое является ссылкой) и скопировал это значение в a.В случае ссылочного типа я могу выполнить операции над этим значением (например, вызов a.SomeProperty = "foo";), и те же самые изменения состояния будут отражены в любом месте программы, где эта конкретная ссылка хранится в переменной.,Другими словами, если бы я проверял значение b.SomeProperty, это было бы "foo".

Однако изменение значение в переменной не влияет на другие переменные, которые указываютк этому значению (за исключением случая ref параметра).

Вы добавили значение, которое указывает на ссылку на ваш List.Вы также присвоили то же значение свойству.Эти две разные ячейки памяти содержат одно и то же значение и, следовательно, указывают на один и тот же фактический объект.Но позже вы просто переназначаете значение свойства, что означает, что теперь оно имеет значение , отличное от того, что хранится в списке.

0 голосов
/ 03 марта 2012

Вы изменяете только ссылку в свойстве cell1.GoalPersonGroup, а не ту, которую вы добавили к base.Components.Чтобы это исправить, вам нужно добавить код в сеттер GoalPersonGroup, чтобы сделать то, что вы хотите.

...