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 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
是两个不相关的类,互不影响。
推荐阅读
- pivot - 如何删除一些旧的枢轴标签附近或最近的结果相似?
- sql - 我想从蜂巢的多列中找到最高行
- javascript - Node、Express 和 MongoDB 中的 HTML 注入。(EJS 模板引擎)
- android - 将手机旋转到横向位置后,如何在 onSaveInstanceState() 中保存文本视图颜色?
- github - How to Change Repository Information?
- python - 使用opencv检测水印
- python - 范围滑块更改 Django 中的函数参数
- c# - C# Windows 窗体仅在我的计算机上成功运行,我尝试更改框架版本
- java - EJB Websocket 握手错误:响应代码不是 101:404
- python - Python 到 Firebase