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对象模型经验。