谨慎使用 Mix-in!
虽然每个类只能从继承自一个超类,但它可以混入(mix in)许多模块。实际上,完全允许将一批模块混入到另一批模块中,并将这些其它模块混入到类中,再将这些类混入到更多模块中。下面是一些代码的示例,这些代码将子类混入在模块中,甚至是混入到模块中的子类中。此代码已被有意简化。有关示例的完整代码,请参阅示例程序 multimods.rb:
multimods.rb
module MagicThing # module
class MagicClass # class inside module
end
end
module Treasure # module
end
module MetalThing
include MagicThing # mixin
class Attributes < MagicClass # subclasses class from mixin
end
end
include MetalThing # mixin
class Weapon < MagicClass # subclass class from mixin
class WeaponAttributes < Attributes # subclass
end
end
class Sword < Weapon # subclass
include Treasure # mixin
include MagicThing # mixin
end
简而言之,虽然模块在使用时可能有助于避免与 C++ 一样的多重继承相关的一些复杂性,但它们仍可能被滥用。如果程序员真的想要创建复杂的类层次结构,并且在模块中的多个级别上具有难以理解的依赖性,那么他或她当然可以这样做。在 multimods.rb 中,我已经展示了用几行代码编写一个难以理解的程序是多么容易。想象一下,你可能将成千上万行这样的代码分散在数十个代码文件中!可以说,这不是我推荐的编程风格,因此你可能需要在混入模块之前仔细考虑一下。