Ruby 在父类方法实现的代码之间插入子类方法实现的代码
我使用继承将常见行为提取到父类中。下面是我的父类BaseService: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
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