外部コードが直接インスタンス化するのを防ぐクラスを作成する必要があります。すべてのインスタンスは、いくつかのクラスメソッドと、新しいインスタンスを生成して返すいくつかのインスタンスメソッドを呼び出すことによって取得されます。
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
ましたが、これも役に立ちませんでした。