2010-05-18 5 views
2

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

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 имеет типа «Точка», который имеет два поля - х, у. Метод Move в классе Point предназначен для изменения местоположения CityCenter. Это выглядит так:

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

Случается, что новый объект, c и существующий объект City изменены. Я думаю, что этот «модификатор» работает и над существующим объектом ...

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

+1

Мелкая копия, возможно? –

+2

Это может помочь опубликовать код в 'City (City c) {}' –

+1

Можете ли вы разместить код конструктора 'City (Город c)'? Я подозреваю, что он создает мелкую копию, поэтому свойство «CityCenter» относится к тому же экземпляру «Point». – dtb

ответ

1

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

4

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

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

+0

В зависимости от того, работает ли это, вам также может понадобиться создать новый CityCenter для нового города ... c.CityCenter = new CityCenter(); – BoxOfNotGoodery

2

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

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

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

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

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

+0

Не удивлюсь, что лучший совет пришел от Джона Скита :) Я согласен, что Точка должна быть неизменной. –

+0

ну, его конкретный API, поэтому я не могу его изменить :( Причина в том, что этот метод newCity создаст новый Город на основе данного с изменениями CityName, а CityCenter будет перемещен в соответствии с dX , dY –

+0

@ user344246: Сколько вы не можете изменить? Это явно нарушено на данный момент ... Учитывая, что установлено количество кварталов и количество жителей, насколько это у него общего с оригиналом? Просто центральная станция? –

Смежные вопросы