1

可能的重复:
红宝石继承与混合

以下是 Ruby 中的常见模式:

module Persistable
  def initialize
    # Initialize a persistable document.
  end
end

class Foo
  include Persistable
end

与简单的子类化相比,这里有什么优势?

class PersistableDocument
  def initialize
    # Initialize a persistable document.
  end
end

class Foo < PersistableDocument
end

换句话说,如果完成的只是一行额外的代码,为什么还要混合定义对象应该如何实例化的行为呢?

4

1 回答 1

1

当您需要为多个类而不是一个类共享代码时,应该使用模块。想想 Ruby 中最常用的模块Enumerable。它期望包含在实现接受单个参数的each方法的对象中。

一旦它被包含在这样的对象中,它将为其所有方法提供一个实现。所以这是使用模块的情况,你有一个共同的行为,你想与许多类共享这个行为,那么你可以使用一个模块来实现它。

模块不是取代继承的东西,它们只是允许给你另一种选择来组合你的对象的行为。

于 2012-05-29T01:47:32.860 回答