Ruby on rails 如何防止从关注点外部访问/覆盖方法?
考虑到以下模型和关注点Ruby on rails 如何防止从关注点外部访问/覆盖方法?,ruby-on-rails,Ruby On Rails,考虑到以下模型和关注点 def MyModel include ConcernA include ConcernB end module ConcernA extend ActiveSupport::Concern def print_a formatted_text end protected def formatted_text "ConcernA" end end module ConcernB extend ActiveSuppor
def MyModel
include ConcernA
include ConcernB
end
module ConcernA
extend ActiveSupport::Concern
def print_a
formatted_text
end
protected
def formatted_text
"ConcernA"
end
end
module ConcernB
extend ActiveSupport::Concern
def print_b
formatted_text
end
protected
def formatted_text
"ConcernB"
end
end
格式化的文本方法被覆盖
=> MyModel.print_a
= "ConcernB"
=> MyModel.print_b
= "ConcernB"
是否有办法真正保护格式化文本方法,使其仅在关注点内可访问,因此不会被覆盖?没有硬保护。如果有人想改变什么,他们很可能会改变。但是,您可以设计一些防止意外名称冲突的保护措施 例如,将方法提取到其自己的命名空间中:
module ConcernA
extend ActiveSupport::Concern
def print_a
Impl.new.formatted_text
end
class Impl
def formatted_text
"ConcernA"
end
end
end
module ConcernB
extend ActiveSupport::Concern
def print_b
Impl.new.formatted_text
end
class Impl
def formatted_text
"ConcernB"
end
end
end
class MyModel
include ConcernA
include ConcernB
end
MyModel.new.print_a # => "ConcernA"
MyModel.new.print_b # => "ConcernB"
这样一来,ConcernA::Impl和ConcernB::Impl是两个不相关的类,它们之间不会相互影响。谢谢@sergio这正是我想要的。在发布之前,我搜索了很多,但没有发现这种方法是一种解决方案。我想我找错东西了。出于兴趣,我应该在哪里搜索/查找?@AndyHarvey:是的,我认为你不能用谷歌搜索这个解决方案,除非你能自己写一个,在这种情况下,你不需要谷歌:。我想,只有几年的ruby对象模型经验。