Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 相互需要的对象_Oop - Fatal编程技术网

Oop 相互需要的对象

Oop 相互需要的对象,oop,Oop,我所处的情况是,两个类(我们称之为A和B)相互关联(它们的方法依赖于另一个类的数据),但IS-A关系不合适。我可以使用合成,这样两个对象都有存储另一个对象的字段。但这对我来说似乎很难看。我目前所做的是创建另一个类C,该类包含通过合成从A和B生成的对象,当我想调用类A的方法时,我传递对象B。我对这种方法的问题是: 我需要将一个对象传递给另一个对象,这样它就开始类似于一个简单的函数参数传递,而不是对象封装其数据的OOP方法 如果我需要更改某些内容,我可能必须修改A和B这两个类的代码,这对于代码重用

我所处的情况是,两个类(我们称之为AB)相互关联(它们的方法依赖于另一个类的数据),但IS-A关系不合适。我可以使用合成,这样两个对象都有存储另一个对象的字段。但这对我来说似乎很难看。我目前所做的是创建另一个类C,该类包含通过合成从AB生成的对象,当我想调用类A的方法时,我传递对象B。我对这种方法的问题是:

  • 我需要将一个对象传递给另一个对象,这样它就开始类似于一个简单的函数参数传递,而不是对象封装其数据的OOP方法
  • 如果我需要更改某些内容,我可能必须修改AB这两个类的代码,这对于代码重用来说不是一个好办法
你推荐什么

示例

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
          }
谢谢,, 佐尔坦

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

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

以下是我的观点:

当您有两个相互依赖的对象时,这可能意味着两个类应该合并到一个更大的类中,从而生成一个同时具有这两种功能的更大的对象


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

一般来说,让两个对象相互依赖不是一个好主意。但是,如果你不提供一些具体的信息/代码,很难说什么。相互组合不是一个好主意,而是一个线索,表明你的类是如此相关,也许,它们必须是一个具有a和B属性的类。但是,没有具体的代码是很难的。是的,它们是相关的,但如果它们是一个类,然后我会有把几乎所有的东西都放在一个类中的诱惑,这在OOP中不是很有利。