首页 > 解决方案 > 如何防止从关注点外部访问/覆盖方法?

问题描述

鉴于以下模型和关注点

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方法,使其只能在关注点内访问,因此不会被覆盖?

标签: ruby-on-rails

解决方案


没有硬性保护。如果有人想改变某些东西,他们很可能能够做到。但是您可以设计一些防止意外名称冲突的保护措施。

例如,将方法提取到它自己的命名空间中:

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::ImplConcernB::Impl是两个不相关的类,互不影响。


推荐阅读