Возникла проблема с модификатором this - PullRequest
2 голосов
/ 18 мая 2010

У меня есть этот метод в классе города. Он должен создать новый город на основе объекта, к которому применяется метод:

 public City newCity(string newCityName, int dX, int dY)
    {
        City c=new City(this); //based on a constructor : City(City c){}

        c.CityName=newCityName;
        c.NoOfNeighborhoods=1;
        c.NumOfResidents=0;
        c.CityCenter.Move(dX,dY);

        return c;
    }

CityCenter имеет тип «Точка», который имеет два поля - x, y. метод Move в классе Point предназначен для изменения местоположения CityCenter. Это выглядит так:

 public void Move(int dX, int dY)
    {
        this.X = x + dX;
        this.Y = y + dY;
    }

Что происходит, так это то, что новый объект c и существующий объект City оба изменены. Я думаю, что модификатор "this" тоже работает на существующем объекте ...

Как я могу воспользоваться методом Move, не вызывая этого поведения? Примечание: это закрытый API, поэтому я могу добавлять в проект только частные методы.

Ответы [ 3 ]

4 голосов
/ 18 мая 2010

Я подозреваю, что City c=new City(this); создает неглубокий клон текущего города, что означает, что они оба используют один и тот же объект Point (может быть истинным, если Point является классом, а не структурой).

Можете ли вы сделать City c=new City(); вместо?

2 голосов
/ 18 мая 2010

Проблема (почти наверняка) в том, что оба города имеют ссылку на один и тот же объект Point. Когда вы меняете объект, это изменение видно по обеим ссылкам. Опции:

  • Создание нового объекта Point при клонировании города
  • Сделать точку типом значения (чтобы создавалась независимая копия
  • Сделайте Point неизменным типом и измените Move, чтобы получить new Point с соответствующим измененным

(или некоторая комбинация вышеперечисленного ...)

Мне кажется, что Point должен , вероятно, быть типом значения (структурой). Обратите внимание, что структуры должны почти всегда быть неизменными.

Вначале кажется странным иметь метод экземпляра newCity - какое отношение новый город должен иметь к старому городу? Почему вы просто не создаете совершенно отдельный город?

1 голос
/ 18 мая 2010

Я предполагаю, что Point - это класс, поэтому вы делитесь ссылкой на один и тот же экземпляр точки.Вам нужно будет создать новый экземпляр Point и назначить его новому City.CityCenter

...