Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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_Module - Fatal编程技术网

Ruby 使用抽象方法通知聚束对象

Ruby 使用抽象方法通知聚束对象,ruby,module,Ruby,Module,我想: 按顺序通知聚束对象: B->C->D 将通知方法与模块分开 然后我写了下面的代码: 模块抽象模块 def应报告? 提出“这应该被覆盖” 结束 def观察员 提出“这应该被覆盖” 结束 def通知 将“#{self.class.to#s}通知” 结束 def通知所有人 通知 观察员。映射{o | o.notify_all}如果观察员和应通知? 结束 结束 B类 包含抽象模块 def观察员 c_objects=2.times.map{c.new} 结束 def应报告? 真的 结束 结束

我想:

  • 按顺序通知聚束对象: B->C->D
  • 将通知方法与模块分开
然后我写了下面的代码:

模块抽象模块
def应报告?
提出“这应该被覆盖”
结束
def观察员
提出“这应该被覆盖”
结束
def通知
将“#{self.class.to#s}通知”
结束
def通知所有人
通知
观察员。映射{o | o.notify_all}如果观察员和应通知?
结束
结束
B类
包含抽象模块
def观察员
c_objects=2.times.map{c.new}
结束
def应报告?
真的
结束
结束
C类
包含抽象模块
def观察员
d_objects=3.times.map{d.new}
结束
def应报告?
真的
结束
结束
D类
包含抽象模块
def观察员
无
结束
def应报告?
假的
结束
结束
obj=B.new
通知所有人
实际上这是我想要的结果,结果是:

B notification
C notification
D notification
D notification
D notification
C notification
D notification
D notification
D notification
但我不满意:

  • B、 C、D必须实施
    观察员
    应报告
    方法
如何重构此代码?

Ruby基于-您不应该创建抽象方法。只要假设它们在那里,如果它们不在那里,就会抛出一个错误。如果要确保特定方法可用,请使用

module Notifiable
  def notify
    puts "#{self.class.to_s} notification"
  end

  def notify_all
    notify
    observers.map{|o| o.notify_all} if respond_to?(:observers) && observers
  end
end

class B
  include Notifiable
  def observers
    c_objects = 2.times.map{ C.new }
  end
end

class C
  include Notifiable
  def observers
    d_objects = 3.times.map{ D.new }
  end
end

class D
  include Notifiable
end

obj = B.new
obj.notify_all