我在City类中有这个方法。它应该根据应用该方法的对象创建一个新城市:
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的类型为“Point”,它有两个字段 - x,y。 Point类中的Move方法用于更改CityCenter位置。它看起来像这样:
public void Move(int dX, int dY)
{
this.X = x + dX;
this.Y = y + dY;
}
新对象c和现有City对象都会发生变化。我认为“this”修饰符也适用于现有对象......
如何在不导致此行为的情况下利用Move方法? 注意:这是一个封闭的API,因此我只能将私有方法添加到项目中。
答案 0 :(得分:4)
我怀疑City c=new City(this);
正在创建当前City的浅克隆,这意味着它们都共享相同的Point对象(如果Point是类而不是结构,则只能为true)
你可以改为City c=new City();
吗?
答案 1 :(得分:2)
问题是(几乎可以肯定)两个城市都引用了同一个Point
对象。更改对象时,可以通过两个引用看到该更改。选项:
Move
以返回新点并进行相关更改(或上述的一些组合......)
听起来像Point应该可能是一个值类型(结构)。请注意,结构应该始终是不可变的。
首先拥有一个newCity
实例方法似乎有点奇怪 - 新城市与老城区的关系是什么?你为什么不只是创建一个完全独立的城市?
答案 2 :(得分:1)
我的猜测是Point是一个类,所以你要分享对该点的同一个实例的引用。您需要创建Point的新实例并将其分配给新的City.CityCenter