簡體   English   中英

如何防止外界關注或訪問某個方法?

[英]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::ImplConcernB::Impl是兩個不相關的類,並且不會互相影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM