2009-10-14 12 views
44
class A 
private 
    def initialize 
    puts "wtf?" 
    end 
end 

A.new #still works and calls initialize 

औररूबी में क्लास कन्स्ट्रक्टर निजी कैसे बनाया जाए?

class A 
private 
    def self.new 
    super.new 
    end 
end 

पूरी तरह

तो सही तरीका क्या है काम नहीं करता है? मैं new निजी बनाना चाहता हूं और इसे फैक्ट्री विधि के माध्यम से कॉल करना चाहता हूं।

+0

मुझे यकीन है कि आप क्या चाहते हैं संभव है नहीं कर रहा हूँ, लेकिन भले ही वह था, सिद्धांत रूप में, आप इसे फैक्ट्री विधि से कॉल करने में सक्षम नहीं होगा क्योंकि यह निजी होगा। क्या आप सिंगलटन बनाने की कोशिश कर रहे हैं? या एक उलटा नियंत्रण पैटर्न करते हैं? – Matt

उत्तर

67

इस प्रयास करें:

class A 
    private_class_method :new 
end 

More on APIDock

+6

यदि आप सिंगलटन क्लास को लागू करने के लिए देख रहे हैं (एकमात्र कारण मैं एक निजी कन्स्ट्रक्टर चाहता हूं), रूबी आपके लिए यह करेगा। http://apidock.com/ruby/Singleton – adurity

+2

और फिर भी कोई एसेन्ड (: नया) कर सकता था। (बीटीडब्ल्यू, "वर्ग" कम मामला नहीं होना चाहिए?) –

+0

हां इसे चाहिए। अभी सुधार हुआ – adurity

13

कोड के दूसरे हिस्सा आप की कोशिश की लगभग सही है। समस्या private कक्षा विधियों के बजाय उदाहरण विधियों के संदर्भ में परिचालन कर रही है।

private या private :new काम करने के लिए प्राप्त करने के लिए, आप बस इसे इस तरह वर्ग के तरीकों के संदर्भ में होना करने के लिए मजबूर करने के लिए की जरूरत है:,

class A 
    class << self 
    private :new 
    end 
end 

या यदि आप वास्तव में new को फिर से परिभाषित और कॉल करना चाहते हैं super

class A 
    class << self 
    private 
    def new(*args) 
     super(*args) 
     # additional code here 
    end 
    end 
end 

क्लास-स्तरीय फैक्ट्री विधियां निजी new तक पहुंच सकती हैं, लेकिन new का उपयोग करके तुरंत तुरंत चालू करने का प्रयास विफल हो जाएगा क्योंकि new निजी है।

+0

उपरोक्त क्योंकि यह कक्षा निजी विधि बनाने का एक पूरी तरह से वैध तरीका है। मुझे छह साल पहले कक्षाओं के वर्ग खोलने के बारे में पता नहीं था। :) –

1

उपयोग पर कुछ प्रकाश डाला करने के लिए यहां कारखाना विधि का एक सामान्य उदाहरण है:

class A 
    def initialize(argument) 
    # some initialize logic 
    end 

    # mark A.new constructor as private 
    private_class_method :new 

    # add a class level method that can return another type 
    # (not exactly, but close to `static` keyword in other languages) 
    def self.create(my_argument) 
    # some logic 
    # e.g. return an error object for invalid arguments 
    return Result.error('bad argument') if(bad?(my_argument)) 

    # create new instance by calling private :new method 
    instance = new(my_argument) 
    Result.new(instance) 
    end 
end 

फिर

result = A.create('some argument')  

रूप में इसका इस्तेमाल जैसी उम्मीद थी, रनटाइम त्रुटि के मामले में होता है प्रत्यक्ष new उपयोग के:

a = A.new('this leads to the error') 
संबंधित मुद्दे