谨慎使用 Mix-in!

虽然每个类只能从继承自一个超类,但它可以混入(mix in)许多模块。实际上,完全允许将一批模块混入到另一批模块中,并将这些其它模块混入到类中,再将这些类混入到更多模块中。下面是一些代码的示例,这些代码将子类混入在模块中,甚至是混入到模块中的子类中。此代码已被有意简化。有关示例的完整代码,请参阅示例程序 multimods.rb

multimods.rb
  1. module MagicThing # module
  2. class MagicClass # class inside module
  3. end
  4. end
  5. module Treasure # module
  6. end
  7. module MetalThing
  8. include MagicThing # mixin
  9. class Attributes < MagicClass # subclasses class from mixin
  10. end
  11. end
  12. include MetalThing # mixin
  13. class Weapon < MagicClass # subclass class from mixin
  14. class WeaponAttributes < Attributes # subclass
  15. end
  16. end
  17. class Sword < Weapon # subclass
  18. include Treasure # mixin
  19. include MagicThing # mixin
  20. end

简而言之,虽然模块在使用时可能有助于避免与 C++ 一样的多重继承相关的一些复杂性,但它们仍可能被滥用。如果程序员真的想要创建复杂的类层次结构,并且在模块中的多个级别上具有难以理解的依赖性,那么他或她当然可以这样做。在 multimods.rb 中,我已经展示了用几行代码编写一个难以理解的程序是多么容易。想象一下,你可能将成千上万行这样的代码分散在数十个代码文件中!可以说,这不是我推荐的编程风格,因此你可能需要在混入模块之前仔细考虑一下。