2010-08-14 4 views
0

J'ai une classe qui ressemble à ceci:Comment refactoriser ce simple extrait de Ruby?

class Base < Library 
    prelude "some-value"  # from Library 
    def foo; ...; end 

    prelude "some-other-value" # from Library 
    def bar; ...; end 

    # ... others 
end 

Je voudrais factoriser en quelque chose comme ce qui suit:

class Base < Library 
    # what goes here to bring FooSupport and BarSupport in? 
end 

class FooSupport (< ... inherit from something?) 
    prelude "..." # Need a way to get Library prelude. 
    def foo; ...; end 
end 

class BarSupport (< ... inherit from something?) 
    prelude "..." # Need a way to get Library prelude. 
    def bar; ...; end 
end 

Comment puis-je faire cela?

Répondre

1

Ce dont vous avez besoin est include. Vous l'avez peut-être déjà utilisé dans les modules, mais cela fonctionne également dans les classes, car Class hérite de Module dans Ruby. Placez vos méthodes de support dans un module et include eux dans votre classe principale.

Comme pour la méthode de classe prelude, appelez simplement cela sur l'objet qui vous est donné dans la méthode included du module.

base.rb:

require "foo" 
require "bar" 

class Base < Library 
    include FooSupport 
    include BarSupport 
end 

foo.rb:

module FooSupport 
    def self.included (klass) 
    klass.prelude "..." 
    end 

    def foo; "..." end 
end 

Edit: Si vous avez besoin d'intercaler des appels à prelude et définitions de méthode, vous peut-être besoin d'utiliser quelque chose de plus comme ceci:

module FooSupport 
    def self.included (klass) 
    klass.class_eval do 
     prelude "..." 
     def foo; "..." end 

     prelude "..." 
     def bar; "..." end 
    end 
    end 
end 
+0

Cela a fonctionné! Merci beaucoup. –