2017-09-09 48 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的集合中寻找一个条目。

我在上面的模型中使用了ids,因为您不能在不同的机器间共享引用,并且不能将它们保存到数据库中。如果你不关心这个,你可以更新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吗? –

相关问题