给出以下模型和关注点
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
formatted_text
方法被覆盖
=> MyModel.print_a
= "ConcernB"
=> MyModel.print_b
= "ConcernB"
是否有一种方法可以真正保护formatted_text
方法,使其仅在关注范围内可访问而不会被覆盖?
答案 0 :(得分:1)
没有硬性保护。如果某人想要更改某些东西,他们很可能能够做到。但是您可以设计一些保护措施来防止意外的名称冲突。
例如,将方法提取到其自己的名称空间中:
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
是两个不相关的类,互不影响。