2016-04-25 38 views
4

我的情况当两个类(姑且称之为一个)是相互关联的(他们的方法依赖于另一个的数据),但IS-A关系是不恰当的。我可以使用组合,以便两个对象都具有存储其他对象的字段。但是这对我来说似乎很难看。我目前做的是通过组合物从创建另一个类Ç包含的对象,并且当我想调用类A的方法,我通过对象。我的这种方法的问题:对象是相互需要对方

  • 我需要一个对象传递给其他所以它开始像一个简单的函数参数,而不是通过面向对象的方法,其中的对象封装的数据
  • 如果我需要改变东西,我可能要修改这两个类一个,这是不是你有什么推荐一个好点的代码重用

的代码?

class Mesh: 
    method: plot(this, Solver) 
      { 
      plot data from class Solver // need to pass a Solver object, so the class is not self-contained 
      } 
    method: intersect(this, Domain) 
      { 
      do sth // depends on Domain, so we need to pass it 
      } 

class Domain: 
    method: plot(this) 
      { 
      plot data from own data // no problem 
      } 
    method: selectVertex(this, Mesh) 
      { 
      do sth // depends on Mesh, so we need to pass it 
      } 

谢谢 佐尔坦

+0

通常这不是一个好主意,让两个对象相互依赖。但是,如果没有你提供一些具体的信息/代码,很难再说更多。 –

+0

相互组合不是一个好主意,而是一个线索,说明你的类是如此相关,也许它们必须只是一个具有A和B属性的类。但是,没有具体的代码是很困难的。 –

+0

是的,它们是相关的,但是如果它们是一个类,那么我会有将几乎所有东西放到一个类中的诱惑,这在OOP中不是很有利。 –

回答

0

“在计算机科学中的所有问题都可以通过除间接的层次过多的问题,间接的另一个层面来解决” - 大卫惠勒。

您试图添加另一个间接层,但它没有解决您的问题。所以有一个根本错误的东西。

这里是我的观点:

当你有2个对象相互取决于彼此它可能暗示2类应合并在一起成为一个更大的类其进而产生具有官能团的更大的对象都是。

为什么不呢?以面向对象的方式为您的域名业务建立模型有很多方法,随着您的域名业务的增长,您的方法可能不再适用。