2013-03-26 17 views
5

Say, A sınıfı ve B numaralı bir modül var. B'u A içine dahil etmek/uzatmak ama dahil/genişletilmiş yöntemleri özel olarak işaretlemek istiyorum (böylece A numaralı arayanlar tarafından erişilemez, ancak A yöntemlerinin içinden erişilebilir olacaktır).Bir modülü ekleyebilir/genişletebilir, ancak tüm/genişletilmiş yöntemleri özel olarak işaretleyebilir miyim?

B'u A içine nasıl dahil edebilirim, ancak dahil edilen tüm yöntemleri özel olarak işaretler misiniz?

+1

Belki bu heyet/kompozisyon ziyade miras bir iş daha uygundur? –

+0

@RonDahlgren Teklif ettiğiniz şeyleri detaylandırır veya temin edebilir misiniz? –

+0

Temsilci, bir iç B örneğini (temsilci) tutmayı içeren bir tasarım modelidir. Açıklamak istediğiniz yöntemler, A bileşiminin, yalnızca bileşimin (“delegeler”) B. Kompozisyonunun içsel örneğine çağırdığı yöntem olarak yazılmalıdır. Belirli bir davranışın 'kompozisyonla yapıldığı daha az özel bir delegasyon şeklidir. Farklı, farklı sınıfların örnekleri. Vikipedi: http://en.wikipedia.org/wiki/Delegation_pattern ve http://en.wikipedia.org/wiki/Object_composition –

cevap

6

Dahil olan tüm yöntemleri özel olarak dahil et ve açıkla?

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

Sen maymun yama Moduleprivate_include ve private_extend eklemek olabilir:

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

Bu soruyu cevaplamak için gerçekten iyi bir maymun oyunu. Bravo. – ghayes

İlgili konular