2013-05-10 83 views
0

我習慣於c#/ .net,所以我來自一個類型安全的背景。我正在使用Ruby。我想創建一個具有私有類的類(ClassA)(如果需要,我會解決受保護的)構造函數。原因是,我想創建一個Factory(FactoryModule :: create)來控制所有ClassA對象的實例化。我意識到這在Ruby中不是傻瓜式的(?),但至少代碼將會自我記錄,因爲基於代碼和ClassA必須通過FactoryModule :: create方法實例化的測試將會很明顯。在ModuleFactory :: create方法中,我嘗試將ClassA構造函數的可見性更改爲public,實例化對象,然後將可見性更改爲private,但是A)我收到錯誤,並且B)它是sl and而不是線程安全的。有什麼想法嗎?想使用工廠的私有構造函數實例化一個ruby類

更新答:

https://gist.github.com/gangelo/5551902

回答

0

更新:答案

包括此模塊在我的課,保護Klass.new被稱爲:

module ProtectedConstructor 
    def self.included(klass) 
    klass.module_eval do 
     class << self 
     protected :new 

     def inherited(klass) 
      klass.module_eval do 
      def self.new(*args); super; end 
      end 
     end 
     end 
    end 
    end 
end 

實例化克拉斯通過受保護的構造函數,發生如下:

Klass.send(:new, *params...*) 

此解決方案的信用可以發現:here

1

如果你想打電話從你的類外的私人(或保護)的方法,你可以使用send。因此,在您的工廠,你可以有這樣的:

instance = ClassA.send(:create) 
+0

感謝兄弟,但我需要保護,最終,Klass.new。我確實使用它來調用幫助我的Klass.send(:new,params)。 – gangelo 2013-05-10 01:33:21

+0

對不起 - 我誤解你的問題,指出你正在將'create'定義爲私有,並將其用於實例化。 – theTRON 2013-05-10 02:04:18

+0

無後顧之憂;似乎最近在進行;也許我是「華而不實的屁股」。 – gangelo 2013-05-10 02:06:36

相關問題