2010-05-18 90 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的類型是「點」,它有兩個領域 - X,Y。 Point類中的Move方法有助於更改CityCenter的位置。它看起來像這樣:

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

會發生什麼是新對象c和現有城市對象都被更改。我認爲「this」修飾符也適用於現有對象...

如何利用Move方法而不引起此行爲? 注意:這是一個封閉的API,所以我只能將私有方法添加到項目中。

+1

淺拷貝,也許? – 2010-05-18 16:43:49

+2

這可能有助於將代碼發佈在城市(城市c){}' – 2010-05-18 16:44:46

+1

您可以發佈「City(City c)'構造函數的代碼嗎?我懷疑它創建了一個淺拷貝,所以'CityCenter'屬性指向相同的'Point'實例。 – dtb 2010-05-18 16:46:28

回答

1

我的猜測是Point是一個類,所以你正在共享對同一個點實例的引用。您將需要創建Point的新實例並將其指定給新City.CityCenter

4

我懷疑City c=new City(this);正在創造一個克隆當前城市,這意味着他們都共享同一個Point對象(如果該點是一個類,而不是一個結構只能是真實的)。

您可以改爲City c=new City();嗎?

+0

取決於是否有效,您可能還需要爲您的新城市創建一個新城市中心... c.CityCenter = new CityCenter(); – BoxOfNotGoodery 2010-05-18 16:46:45

2

問題是(幾乎可以肯定),兩個城市都有對同一個Point對象的引用。當您更改對象時,通過這兩個引用可以看到該更改。選項:

  • 創建一個新的Point對象,當你克隆城市
  • 創建點的值類型(讓一個獨立的副本是由
  • 創建點不可變型和改變Move返回一個點與相關的變更進行

(或以上的一些組合...)

它SOU對我來說像Point應該可能是一個值類型(結構)。請注意,結構體應該幾乎總是是不可變的。

首先有一個newCity實例方法似乎有些奇怪 - 新城市對舊城區意味着什麼關係?你爲什麼不創建一個完全獨立的城市?

+0

我不應該感到驚訝的是最好的建議來自Jon Skeet :)我同意Point應該是不可變的。 – 2010-05-18 16:55:53

+0

好吧,它是一個給定的API,所以我不能改變它:( 的原因是這樣的話,這個newCity方法將創建一個新城市,基於給定城市名稱的變化,城市中心將根據dX ,dY – 2010-05-18 16:58:56

+0

@ user344246:你有多少不能改變?現在顯然已經壞了......鑑於居民區的數量和居民的數量也被確定了,它與原來的數量有多少?只是中央車站? – 2010-05-18 16:59:52