2013-03-26 5 views
5

कहें, मेरे पास कक्षा A और एक मॉड्यूल B है। मैं B को A में शामिल/विस्तारित करना चाहता हूं लेकिन निजी/विस्तारित विधियों को निजी के रूप में चिह्नित करना चाहता हूं (इसलिए वे A के कॉलर्स तक पहुंच योग्य नहीं होंगे लेकिन A के तरीकों के भीतर पहुंच योग्य होंगे)।क्या मैं मॉड्यूल को शामिल/विस्तारित कर सकता हूं लेकिन सभी शामिल/विस्तारित विधियों को निजी के रूप में चिह्नित कर सकता हूं?

मैं B को A में कैसे शामिल कर सकता हूं लेकिन सभी शामिल विधियों को निजी के रूप में चिह्नित कर सकता हूं?

+1

हो सकता है कि यह एक नौकरी बेहतर प्रतिनिधिमंडल/रचना के बजाय विरासत के लिए अनुकूल है? –

+0

@RonDahlgren क्या आप प्रस्तावित करने के लिए विस्तृत या प्रदान कर सकते हैं या लिंक कर सकते हैं? –

+0

प्रतिनिधिमंडल एक डिजाइन पैटर्न है जिसमें बी (प्रतिनिधि) का आंतरिक उदाहरण शामिल है। जिन तरीकों का आप खुलासा करना चाहते हैं उन्हें ए के तरीकों के रूप में लिखा जाना चाहिए, जहां कार्यान्वयन बी के आंतरिक उदाहरण में केवल कॉल ("प्रतिनिधियों") को कॉल करता है। प्रतिनिधिमंडल का एक कम विशिष्ट रूप है, जहां एक विशेष व्यवहार 'कंपोजिटिंग' द्वारा किया जाता है 'अलग, अलग वर्गों के उदाहरण। विकिपीडिया: http://en.wikipedia.org/wiki/Delegation_pattern और http://en.wikipedia.org/wiki/Object_composition –

उत्तर

6

शामिल करें और फिर स्पष्ट रूप से सभी शामिल विधियों को निजी बनाएं?

class A 
    include B 
    private *B.instance_methods 
    extend B 
    class << self 
    private *B.instance_methods 
    end 
end 

आप बंदर पैच Moduleprivate_include और private_extend जोड़ने के लिए कर सकते हैं:

class Module 
    def private_include *modules 
    class_eval do 
     self.send(:include, *modules) 
     modules.each do |mod| 
     self.send(:private, *mod.instance_methods) 
     end 
    end 
    end 

    def private_extend *modules 
    singleton = class << self; self end 
    singleton.instance_eval do 
     self.send(:include, *modules) 
     modules.each do |mod| 
     self.send(:private, *mod.instance_methods) 
     end 
    end 
    end 
end 
+1

यह सवाल का जवाब देने के लिए वास्तव में एक अच्छा बंदरगाह है। वाहवाही। – ghayes

संबंधित मुद्दे

 संबंधित मुद्दे