2017-09-09 8 views
0

私は一緒に行く2つのクラスを持っていますが、与えられたクラスのオブジェクトはいつでも他のクラスのオブジェクトとパートナーされていてもいなくてもよく、パートナーはプログラムの過程で変更するかもしれません。リンクされたクラスを結合して切り離す良い方法はありますか?

それぞれのオブジェクトにパートナーがアクセスできるようにしたい場合、両方のオブジェクトが現在のパートナーの正確なレコードを保持していることを確認します。

私は以下のように動作するように見えますが、無限ループに巻き込まれるのを避けるために3つの関数呼び出しが必要です。ちょっと混乱しているようです。私が見ていないよりよい方法はありますか?

(ちなみに、これは、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

は、あなたが(もし 'に沿って何かを意味し、既に存在するものを設定していることを確認してくださいも参照(existingHorse、値){...}' –

答えて

2

私が第3のクラスを作成することをお勧めしたいです。馬は乗り物とは別物であり、その逆もあります。お互いが存在する必要はありません。彼らは一緒にいるとき、彼らは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を使用しました。あなたはそれを気にしない場合は、代わりに参照を使用する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

を持つされています馬とキャリッジIDより実際の馬と運送車の参考になったほうがいいですか? –

+0

一般的に、私は答えを更新してもう少し詳しく説明します。 –

+0

私は少し懐疑的でした。 –

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'を処理できるかどうか –

関連する問題