代码之家  ›  专栏  ›  技术社区  ›  Dex

Ruby子类:包括基于继承的不同模块

  •  2
  • Dex  · 技术社区  · 14 年前

    我有两个类,任务和子任务。子任务与任务的差别很小,除了一件重要的事情,它必须包含不同的模块。

    包含的模块,子任务模块和任务模块,在我看来都有相同的方法和别名,但是在内部,一旦包含的模块扩展了它的方法,它们的功能就有点不同了。我没有办法解决这个问题,因为我正在使用一个插件。

    例如,下面,你看 belongs_to 属于

    class Subtask < Task
      include subtask_module 
    end
    
    class Task
      include task_module
    
      # methods and aliases both classes use (defined in included file) 
      # but behavior changes based on
      # included file
      belongs_to :template    
    end
    

    做这种事最好的方法是什么?现在它像现在一样工作。但它看起来有些臃肿,因为任务中会声明一些我不需要的未使用的东西。

    最好的方法是什么?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Joshua Cheek    14 年前

    您可以将Task也转换成一个子类,然后让每个子类继承一些公共的东西(尽可能使用上面的名称)

    class Task
      belongs_to :template    
    end
    
    class Subtask1 < Task
      include subtask_file 
    end
    
    # this used to be Task, now is Subtask2
    class Subtask2 < Task
      include task_file
    end
    

    或者,您将共享功能移到自己的模块中,然后将其包括在内,并完全避免使用超类/子类(我会选择这个)。

    module TaskShared
      belongs_to :template    
    end
    
    class Task
      include TaskShared
      include task_file
    end
    
    class Subtask
      include TaskShared
      include subtask_file 
    end
    

    module TaskShared
      def self.included(klass)
        klass.belongs_to :template
      end
    end
    

    请注意,有些情况下这会变得很棘手,例如从ActiveRecord::基类继承。