0

外部コードが直接インスタンス化するのを防ぐクラスを作成する必要があります。すべてのインスタンスは、いくつかのクラスメソッドと、新しいインスタンスを生成して返すいくつかのインスタンスメソッドを呼び出すことによって取得されます。

class SomeClass
  class << self
    private :new, :allocate
  end

  def initialize(hash)
    @hash = hash
  end

  # A class method that returns a new instance
  def self.empty
    new({})   # works fine!
  end

  # Another class method that returns a new instance
  def self.double(a, b)
    new({a => b})   # works fine!
  end

  # An instance method that will generate new instances
  def combine_with(a, b)
    # Here's the problem!
    # Note: it doesn't work with self.class.new either
    SomeClass.new(@hash.merge({a => b}))
  end
end

newそこで、メソッドをプライベートに定義しました。これはクラスメソッドで機能しますが、その内部ではまだ内部でnewを呼び出すことができます。newしかし、インスタンスメソッド内から呼び出すことはできません。保護対象として定義しようとしnewましたが、これも役に立ちませんでした。

4

1 に答える 1

1

使ってみましたsendか?

SomeClass.send :new, @hash.merge({a => b})
于 2012-11-30T17:06:09.687 に答える