2017-09-09 11 views
0

나는 함께가는 두 개의 클래스가 있지만 주어진 클래스의 객체는 다른 클래스의 객체와 파트너가 될 수도 있고되지 않을 수도 있으며, 파트너는 프로그램 과정에서 변경 될 수 있습니다.연결된 클래스를 결합하고 분리하는 좋은 방법은 무엇입니까?

각 개체가 파트너에 액세스 할 수있게하려면 두 개체가 현재 파트너의 정확한 레코드를 유지하도록하고 싶습니다.

(아래) 작동하는 것처럼 보였지만 무한 루프에 걸리지 않도록 세 가지 함수 호출이 필요하며 다소 지저분 해 보입니다. 내가 볼 수없는 더 좋은 방법이 있을까요?

은 (그건 그렇고,이 때문에 그 모든 변수가 참조하고, C 번호입니다. 경우가 분명하지 않았다.)

class Horse { 
    private Carriage existingCarriage; 

    public Horse(int num) { horseNumber = num;} 

    public void setCarriage(Carriage newCarriage) { 

     if(existingCarriage != null) { 
      Carriage temp = existingCarriage; 
      existingCarriage = null; 
      temp.setHorse(this); 
     } 

     existingCarriage = newCarriage; 
    } 
} 

//pretty much the same thing with "Horse" and "Carriage" switched. 
class Carriage { 
    private Horse existingHorse; 

    public Carriage() {} 

    public void setHorse(Horse newHorse) { 

     if(existingHorse != null) { 
      Horse temp = existingHorse; 
      existingHorse = null; 
      temp.setCarriage(this); 
     } 

     existingHorse = newHorse; 
    } 
} 
+0

하려고하면 이미 존재하는 무언가를 설정하는 것을 확인 '을 따라 뭔가 의미 (ReferenceEquals (existingHorse, 값) {...}'의 경우 –

답변

2

나는 세 번째 클래스를 만드는 게 좋을 것. 말은 운송 수단과 별개이며, 그 반대도 마찬가지입니다. 서로가 존재할 필요가 없습니다. 그들이 함께있을 때, 그들은 HorseAndCarriage 있습니다 : 당신이 마차에 말을 할당 할 때, 당신은 말이나 마차의 속성을 수정하지 않는

public class Horse 
{ 
    public int Id { get; set; } 

    public Horse(int id) 
    { 
     Id = id; 
    } 
} 

public class Carriage 
{ 
    public int Id { get; set; } 

    public Carriage(int id) 
    { 
     Id = id; 
    } 
} 

public class HorseAndCarriage 
{ 
    public int HorseId { get; set; } 
    public int CarriageId { get; set; } 

    public HorseAndCarriage(int horseId, int carriageId) 
    { 
     HorseId = horseId; 
     CarriageId = carriageId; 
    } 
} 

, 새 HorseAndCarriage 엔티티를 생성하는 (그리고 경우 말은 이미 다른 마차에 할당되었거나 마차가 이미 다른 말에 할당되었으므로 해당 문자는 HorseAndCarriage입니다. 어떤 캐리지가 말에 할당되었는지 또는 그 반대인지 알고 싶으면 HorseAndCarriage의 콜렉션에서 항목을 찾습니다.

다른 컴퓨터에서 참조를 공유 할 수 없기 때문에 위 모델에서 ID를 사용했고 데이터베이스에 유지할 수 없기 때문에 ID를 사용했습니다. 당신이 걱정하지 않는 경우, 대신 참조를 사용하는 HorseAndCarriage 클래스를 업데이트 할 수 있습니다 :

public class HorseAndCarriage 
{ 
    public Horse Horse { get; set; } 
    public Carriage Carriage { get; set; } 

    public HorseAndCarriage(Horse horse, Carriage carriage) 
    { 
     Horse = horse; 
     Carriage = carriage; 
    } 
} 
+0

는 데이 같은 간단한 뭔가 트릭을 할해야 Horse와 Carriage Id는 실제 말과 캐리지에 대한 참조를 더 잘 표현한 것입니까? –

+0

일반적으로 예. 대답을 조금 더 설명하도록 업데이트하겠습니다. –

+0

나는 이것에 대해 약간 회의적 이었지만, 제 3의 클래스를 혼합하면, 정말로 당신이 그것에 대해 옳았다는 것이 분명 해졌다. –

0

난 당신이 많은 코드를 필요가 있다고 생각하지 않습니다. !.

class Horse 
{ 
    public Carriage existingCarriage; 

    public void setCarriage(Carriage newCarriage) 
    { 
     existingCarriage = newCarriage; 
     if (existingCarriage != null) existingCarriage.existingHorse = this; 
    } 
} 

class Carriage 
{ 
    public Horse existingHorse; 

    public void setHorse(Horse newHorse) 
    { 
     existingHorse = newHorse; 
     if (existingHorse != null) existingHorse.existingCarriage = this; 
    } 
} 
+1

말은 캐리지와 짝을 지을 수 없다. 이것을 업데이트하여 'null'을 처리 할 수 ​​있는가? –