2010-05-18 2 views
2

이 메서드는 City 클래스에 있습니다. - X, Y"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에 두 개의 필드가 유형 "포인트"이다 : 그것은 방법에 적용되는 개체를 기반으로 새로운 도시를 만들어야합니다. Point 클래스의 Move 메서드는 CityCenter 위치를 변경하는 데 사용됩니다.

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

새로운 개체, c 및 기존 City 개체가 모두 변경된다는 것은 어떻게됩니까? "this"수정 자도 기존 객체에서 작동한다고 생각합니다 ...

어떻게이 동작을하지 않고도 Move 메서드를 사용할 수 있습니까? 참고 :이 API는 비공개 API이므로 개인 메서드 만 프로젝트에 추가 할 수 있습니다.

+1

아마도 얕은 복사? –

+2

'City (City c) {}'에 코드를 게시하는 것이 도움이 될 수 있습니다. –

+1

'City (City c)'생성자의 코드를 게시 할 수 있습니까? 나는 이것이 'CityCenter' 속성이 동일한'Point' 인스턴스를 참조하도록 얕은 사본을 생성하는 것으로 의심합니다. – dtb

답변

1

내 생각에 포인트는 클래스이므로 포인트의 동일한 인스턴스에 대한 참조를 공유합니다. 포인트의 새 인스턴스를 생성하고이를 새로운 City.CityCenter에 할당해야합니다.

4

나는 City c=new City(this);들이 모두 동일한 Point 객체를 공유하는 의미 현재 도시의 얕은 클론을 만드는 의심 (포인트 클래스가 아닌 구조체 인 경우에만 사실 일 수있다).

대신 City c=new City(); 할 수 있습니까?

+0

작동 여부에 따라 새로운 CityCenter를 새로 만들 필요가 있습니다 ... c.CityCenter = new CityCenter(); – BoxOfNotGoodery

2

두 도시가 동일한 Point 객체에 대한 참조를 갖는 것이 거의 확실합니다. 개체를 변경하면 해당 변경 사항이 두 참조를 통해 표시됩니다. 옵션 :

  • 는 독립적 인 복사본이
  • 만들기 포인트 불변의 유형을 만들어 있도록 (도시에게
  • 만들기 포인트 값 유형을 복제 할 때 새 Point 객체를 생성하고 새를 반환하는 Move 변경 관련 변화 포인트는

(또는 위의 조합 ...)

그것은 SOU했다 nds처럼 포인트 아마 값 형식 (구조체)해야합니다. 구조체는 거의 이어야하며 항상이어야합니다.

처음에는 newCity 인스턴스 메소드를 사용하는 것이 다소 이상한 것처럼 보입니다. 새로운 도시는 구시 가지와 어떤 관계가 있습니까? 왜 완전히 별개의 도시를 만들지 않는거야?

+0

나는 최고의 조언이 Jon Skeet에서 왔음에도 불구하고 놀랄 필요가 없다. 나는 Point가 불변이어야한다는 데 동의한다. –

+0

글쎄, 그 주어진 API, 그래서 나는 그것을 바꿀 수 없다 : ( 이 newCity 메소드는 CityName의 변화와 함께 주어진 하나를 기반으로 새로운 City를 만들 것이고 CityCenter는 dX에 따라 이동할 것이다. , dY –

+0

@ user344246 : 얼마나 많이 바꿀 수 없습니까? 현시점에서 분명히 부러졌습니다 ... 주민 번호와 거주자 수를 고려하면 원본과 얼마나 비슷한가? 그냥 중앙역입니까? –