2012-02-15 10 views
1

私のクラスメソッド "コンストラクタ"で新しいインスタンスを作成したいので、newメソッドがプライベートになっているクラスがあります。しかし、私は今また新しいインスタンスを作成するいくつかのインスタンスメソッドを持つ必要があります。Class.newがプライベートである場合のインスタンスメソッドの新しいインスタンス

たとえば、次のスニペットを見てください。

Class Foo 

    class << self 

    #a "constructor" method 
    def from_x arg 
     stuff_from_arg = arg.something #something meaningful from arg 
     new(stuff_from_arg) 
    end 
    end 

    def initialize stuff 
    @stuff = stuff 
    end 

    private_class_method :new #forces use of Foo.from_x 

    def method_a 
    other_stuff = "blah" 
    #These do not work 
    return new(blah) #nope, instance cannot see class method 
    return self.class.new(blah) #nope, new is private_class_method 
    return Foo.new(blah) #same as previous line 
    return initialize(blah) #See *, but still doesn't work as expected 
    end 
end 

私は何を考え始めていますが、私は新しいを作成するために、別のクラスのコンストラクタメソッドを作成する必要があり、このような方法でこのクラスを設計しているかもしれないということです。私は悩みを抱えているところそれはmethod_aでありますFooは、次のように:

#in addition to previous code 
Class Foo 
    class << self 
    def just_like_new stuff 
     new(stuff) 
    end 
    end 
end 

これは非常に右または非常にDRYに感じることはありませんが、おそらくこれは私が自分のために作ったベッドです。何か私にできることはありますか?

*この行は少し驚いています。それはblahを返します。クラス定義の外には、initializeもあり、それは0引数をとり、nilを返す誰もがここで起こっていることを知っていますか?

答えて

1

あなたは常にアクセス制御を回避するためにsendを使用することができます。

def from_x arg 
    stuff_from_arg = arg.something #something meaningful from arg 
    self.class.send(:new, stuff_from_arg) 
end 
関連する問題