[英]How to prevent a method from being accessed/ overwritten from outside a concern?
鑒於以下模型和關注點
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
方法,使其僅在關注范圍內可以訪問而不會被覆蓋?
沒有硬性保護。 如果某人想要更改某些東西,他們很可能能夠做到。 但是您可以設計一些保護措施來防止意外的名稱沖突。
例如,將方法提取到其自己的名稱空間中:
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
是兩個不相關的類,並且不會互相影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.