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
在Ruby中,如何让父对象拥有的两个对象彼此对话?_Ruby_Oop - Fatal编程技术网

在Ruby中,如何让父对象拥有的两个对象彼此对话?

在Ruby中,如何让父对象拥有的两个对象彼此对话?,ruby,oop,Ruby,Oop,首先,如果这是一个n00b问题,我很抱歉。我是一名自学成才的网络开发人员,这是我第一次真正进入应用程序领域。我试图找到我所寻找的答案,但我不确定正确的术语,因此没有找到任何相关的结果。我想这是因为要么我不知道我需要什么的正确方式;答案很明显,不需要写,或者我问的问题很愚蠢,根本不存在这个概念,我应该完全用另一种方式来做 不管怎样,请回答我的问题。我正在开发一个有3个类的应用程序,这给我带来了麻烦。还有“MainContainer”,它主要处理UI;挑选任务的“指派者”;以及完成任务的“工人”。这

首先,如果这是一个n00b问题,我很抱歉。我是一名自学成才的网络开发人员,这是我第一次真正进入应用程序领域。我试图找到我所寻找的答案,但我不确定正确的术语,因此没有找到任何相关的结果。我想这是因为要么我不知道我需要什么的正确方式;答案很明显,不需要写,或者我问的问题很愚蠢,根本不存在这个概念,我应该完全用另一种方式来做

不管怎样,请回答我的问题。我正在开发一个有3个类的应用程序,这给我带来了麻烦。还有“MainContainer”,它主要处理UI;挑选任务的“指派者”;以及完成任务的“工人”。这是一个非常早期的阶段,但这就是它现在的样子

class MainContainer

  def setup
    @worker = Worker.new(:x => 200, :y => 200)
    @assigner = Assigner.new(:x => 400, :y => 300)
  end

  # update & draw code
end

class Assigner

  def set_target
    parent.worker.target self.x, self.y
  end

  # input, update & draw code
end

class Worker < GameObject

  def target(tx, ty)
    @target_x = tx
    @target_y = ty
    @has_task = true
  end

  # update & draw code
end
class主容器
def设置
@worker=worker.new(:x=>200,:y=>200)
@assigner=assigner.new(:x=>400,:y=>300)
结束
#更新和绘制代码
结束
类赋值器
def设置_目标
parent.worker.target self.x,self.y
结束
#输入、更新和绘制代码
结束
类工作者<游戏对象
def目标(tx,ty)
@目标x=tx
@目标_y=ty
@has_task=true
结束
#更新和绘制代码
结束
应用程序的基本流程是这样的:一个MainContainer实例加载并在屏幕上显示UI,包括分配者和工作者。然后,用户使用赋值器在UI中移动并选择任务。到目前为止,一切正常

我不明白的是赋值人如何将值传递给工作者。示例中的代码是worker的set_target方法。
parent.worker.target self.x,self.y
行是我最近的一次尝试。我在这里尝试过的其他方法包括
@worker.target self.x、self.y

我曾考虑将
@worker
传递给
@assigner
,但计划是让任意数量的员工随时间增加/减少。我计划使用
WorkerManager
来处理这些问题,它将跟踪当前可用的工作人员数量,但如果我将其传递到@assigner,传递的不仅仅是它的一个副本吗?我离实现类似的东西还有很长的路要走,所以我还没有对它进行测试,也许这就是要走的路

我考虑过的另一件事是让员工成为一名全球员工,但这是一个可能会再次频繁出现的问题,因此我最终会得到一个充满全球员工的应用程序,我猜这不是正确的方式

我是Webdev的,所以我能想到的唯一其他解决方案是将所有这些都建立数据库。如果我不能做任何其他事情,这是最后的办法

无论如何,我要重新陈述我的问题。在MainContainer的一个实例中,如何让它的赋值器和工作器在彼此之间传递数据


我非常感谢您的帮助,即使是类似“stfu n00b,阅读此:-相关链接”的内容。

我认为设计中的某个地方存在缺陷。你说指派者选择任务,工人做。看起来他们不需要沟通。如果他们需要的话,他们可能会做得比您描述的更多,这可能意味着有机会重构成责任更少的更孤立的类

那么,如果主容器拥有所有控制权呢

def main
  @worker = Worker.new
  @assigner = Assigner.new
  target = @assigner.target
  result = @worker.do_work(target)
  update_ui(result)
end
UI实际上应该与业务逻辑分开,上面的伪代码只是说明了将控制权交给MainContainer的想法,以避免工作人员和分配人员相互交谈。这还允许您在必要时处理多个工作人员


我希望这能有所帮助。

我的回答可能会因为我没有清楚地理解问题的要点而受到影响,所以请记住这一点,并纠正我的错误

最好的方法可能是将工作者和分配者完全隔离,并将所有逻辑放入控制器中

但是,如果您需要工人之间进行更多的沟通,并且希望让转让人参与其中,那么转让人最好了解其创建的工人,让工人知道是哪个转让人创建了他们。然后,分配者应负责创建工人(以及创建分配者的控制器)。类似(丑陋、未优化和未测试的代码):

类赋值器
属性读取器:工人
def初始化
@工人=[]
结束
def创建工作程序
worker=worker.new
worker.assigner=self

@工人们,这真的帮了我的忙,我现在已经开始工作了。我让MainContainer从赋值器获取数据并将其传递给Worker,而不是赋值器将数据传递给Worker。谢谢!谢谢你花时间回答我的问题。让工人归转让人所有并不是我真正想要的,因为工人也会被应用程序的许多其他部分操纵。然而,您已经提出了一些非常有用的观点,并且知道所有内容都是通过引用传递的,这对我有很大的帮助。我有我需要的答案,但非常感谢你的贡献!
class Assigner
  attr_reader :workers
  def initialize
    @workers = []
  end
  def create_worker
    worker = Worker.new
    worker.assigner = self
    @workers << worker
    worker
  end
end

class Worker
  attr_accessor :assigner
end