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

Ruby 在父类方法实现的代码之间插入子类方法实现的代码

Ruby 在父类方法实现的代码之间插入子类方法实现的代码,ruby,inheritance,Ruby,Inheritance,我使用继承将常见行为提取到父类中。下面是我的父类BaseService: class BaseService def initialize(data, failure_strategy) @data = data @failure_strategy = failure_strategy end def create return if associated_model.find_by(id: @data['id']) # insert specifi

我使用继承将常见行为提取到父类中。下面是我的父类BaseService:

class BaseService
  def initialize(data, failure_strategy)
    @data = data
    @failure_strategy = failure_strategy
  end

  def create
    return if associated_model.find_by(id: @data['id'])
    # insert specific code from child class CREATE method implementation here
  rescue => exception
    @failure_strategy.rescue(exception)
  end

  private

  def associated_model
    self.class.to_s.delete("EventsService").constantize
  end
end
基本上,我是在发生异常时实施不同的故障策略。但是,我希望将我的子类实现的
create
中的特定代码插入create的父类实现中的两段代码之间

return if associated_model.find_by(id: @data['id'])
        # insert specific code from child class CREATE method implementation here
      rescue => exception
        @failure_strategy.rescue(exception)
在ruby中实现这种行为的正确方法是什么

在ruby中实现这种行为的正确方法是什么

与任何具有经典继承的OOP语言相同:使用模式

在ruby中实现这种行为的正确方法是什么

与任何具有经典继承的OOP语言相同:使用模式


我明白了,但我的问题是我希望我的子类中的方法被命名为
create
…我想我要找的是某种反向超级@SergioTulentsev你知道这是否真的有可能吗?@DavidGeismar:查看更新。这可能是你能得到的最好的东西:)“和任何OOP语言一样:行为覆盖。”——这是对“OOP语言”的狭隘看法。Beta的前缀继承工作原理与OP的需求完全相同:不是子类方法实现调用超类实现,而是相反:超类方法在实现中留下“漏洞”,由子类方法填补。因此,这与传统继承正好相反:超类方法调用其子类实现。注意,mixin继承包含经典继承和前缀继承。(参见拼图)OP需要一个具有相同名称的方法来覆盖超类方法,然后可以由超类方法调用。这正是前缀继承的工作原理,或多或少与经典继承的工作原理相反。您的第一句话似乎暗示所有OOP语言都使用经典继承,但事实并非如此。(事实上,有些甚至没有继承,而有些非OOP语言也有继承,甚至是经典继承。)这里使用的模板方法模式本质上是一种解决缺少前缀继承的方法。完美。将单词模板方法设计模式包含在某个地方可能是有意义的,因为它就是这样。还有,“hook”和可能的“callback”(虽然后者的含义近年来似乎已经转向异步编程)。我明白了,但我的问题是我希望子类中的方法命名为
create
…我想我要找的是某种反向超级@SergioTulentsev你知道这是否真的有可能吗?@DavidGeismar:查看更新。这可能是你能得到的最好的东西:)“和任何OOP语言一样:行为覆盖。”——这是对“OOP语言”的狭隘看法。Beta的前缀继承工作原理与OP的需求完全相同:不是子类方法实现调用超类实现,而是相反:超类方法在实现中留下“漏洞”,由子类方法填补。因此,这与传统继承正好相反:超类方法调用其子类实现。注意,mixin继承包含经典继承和前缀继承。(参见拼图)OP需要一个具有相同名称的方法来覆盖超类方法,然后可以由超类方法调用。这正是前缀继承的工作原理,或多或少与经典继承的工作原理相反。您的第一句话似乎暗示所有OOP语言都使用经典继承,但事实并非如此。(事实上,有些甚至没有继承,而有些非OOP语言也有继承,甚至是经典继承。)这里使用的模板方法模式本质上是一种解决缺少前缀继承的方法。完美。将单词模板方法设计模式包含在某个地方可能是有意义的,因为它就是这样。此外,“hook”和可能的“callback”(尽管后者的含义近年来似乎已经转向异步编程)。在
关联的_模型中,
self.class.to_s#=>“BaserService”
,因此
“BaserService”。删除(“EventsService”)#=>“Ba”
。这就是你想要的吗?另外,Ruby没有方法
constantize
。我相信Rails有一个,但是没有Rails标签。最后,由于您有一个“Ruby”标记,所以标题中不需要
(Ruby)
。@CarySwoveland这确实来自rails项目。我按照建议删除了标题中对ruby的引用。关联的_模型应该在子类中调用。BaseService实际上是一个“抽象类”(即使ruby中没有这样的东西),所以我不认为这是一个问题,我建议您添加一个Rails标记。这就是你想要的吗?另外,Ruby没有方法
constantize
。我相信Rails有一个,但是没有Rails标签。最后,由于您有一个“Ruby”标记,所以标题中不需要
(Ruby)
。@CarySwoveland这确实来自rails项目。我按照建议删除了标题中对ruby的引用。关联的_模型应该在子类中调用。BaseService实际上是一个“抽象类”(即使ruby中没有这样的东西),所以我认为这不是一个问题,我建议您添加一个Rails标记。
class BaseService

  def create
    return if associated_model.find_by(id: @data['id'])

    specific_create
  rescue => exception
    @failure_strategy.rescue(exception)
  end

  private

  def specific_create
    # default behaviour, possibly empty.
  end
end

class SpecificService < BaseService
  def specific_create
    # overridden behaviour
  end
end
class Parent
  def create
    puts "prep work"
    yield
  rescue => ex
    puts "error: #{ex}"
  end
end

class Child < Parent
  def create
    super do
      puts "specific work"
    end
  end
end

Child.new.create
# >> prep work
# >> specific work