将子类方法实现中的代码插入父类方法实现中的代码之间

时间:2019-04-23 12:23:13

标签: 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 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中实现这种行为的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

  

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

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

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

  

我看到了,但是我的问题是我希望子类中的方法被命名为create。我想我要寻找的是某种反向super

这看起来就像您可以对积木进行的操作。

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