2013-03-26 6 views
5

Powiedzmy, że mam klasę A i moduł B. Chciałbym dołączyć/rozszerzyć B do A, ale oznaczono jako włączone/rozszerzone metody jako prywatne (więc nie będą dostępne dla osób dzwoniących pod numerem A, ale będą dostępne w metodach A).Czy mogę dołączyć/rozszerzyć moduł, ale oznaczyć wszystkie włączone/rozszerzone metody jako prywatne?

Jak dołączyć B do A, ale zaznacz wszystkie włączone metody jako prywatne?

+1

Może to zadanie lepiej nadaje się do składu delegacji/zamiast dziedziczenia? –

+0

@RonDahlgren Czy możesz opracować lub podać lub połączyć z tym, co proponujesz? –

+0

Delegacja to wzorzec projektowy obejmujący utrzymywanie wewnętrznej instancji B (delegata). Metody, które chcesz ujawnić, powinny być napisane jako metody A, gdzie implementacja po prostu wywołuje ("delegatów") wewnętrzną instancję B. Kompozycja jest mniej konkretną formą delegacji, gdzie określone zachowanie jest dokonywane przez "kompozycję "wystąpienia różnych, odmiennych klas. Wikipedia: http://pl.wikipedia.org/wiki/Delegacja_pattern i http://pl.wikipedia.org/wiki/Object_composition –

Odpowiedz

6

Włącz, a następnie jawnie uczyń wszystkie włączone metody prywatnymi?

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

Można małpa łata Module dodać private_include i 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

To naprawdę dobry monkeypatch, aby odpowiedzieć na pytanie. Brawo. – ghayes

Powiązane problemy