我正在使用继承将常见行为提取到我的父类中。这是我的父类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中实现这种行为的正确方法是什么?
答案 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