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

时间:2010-07-02 06:54:36

标签: ruby-on-rails ruby

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

包含的模块,subtask_module和task_module都有相同的方法和别名,但是在内部它们在包含的模块扩展其方法时的功能略有不同。我无法解决这个问题,因为我正在使用插件。

例如,下面,您在任务中看到belongs_tobelongs_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

这样做的最佳方式是什么?现在它可以像现在一样工作。但它看起来很臃肿,因为在Task中声明了我不需要的未使用的东西。

最好的方法是什么?

1 个答案:

答案 0 :(得分:4)

你也可以把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

(belongs_to可能会给你带来困难。如果是这样,请尝试在附加的钩子中添加它)

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

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