我正在阅读Ruby,并了解了它的mixins模式,但是没想到很多有用的mixin功能(因为我不习惯这么想的方式).所以我想知道什么是有用的Mixin功能的好例子?
谢谢
编辑:有点背景.我来自C++和其他对象语言,但我怀疑的是Ruby说它不是继承mixins,但我一直认为mixins是多重继承,所以我担心我想把它们分类太快进入我的舒适区,并没有真正了解mixin是什么.
它们通常用于向类添加某种形式的标准功能,而无需重新定义它们.您可能认为它们有点像Java中的接口,但不仅仅是定义需要实现的方法列表,其中许多实际上都是通过包含模块来实现的.
标准库中有一些示例:
单例 - 可以混合到任何类中以使其成为单例的模块.initialize方法是私有的,并添加了一个实例方法,它确保应用程序中只有该类的一个实例.
可比较 - 如果将此模块包含在类中,则定义<=>方法(将当前实例与另一个对象进行比较,并说明哪个更大)足以提供<,<=,==,> =,>和之间?方法.
可枚举 - 通过混合此模块并定义每个方法,您可以获得所有其他相关方法的支持,例如collect,inject,select和reject.如果它也有<=>方法,那么它也将支持sort,min和max.
DataMapper也是一个有趣的例子,可以使用简单的include语句,采用标准类,并添加将其持久保存到数据存储的功能.
我认为通常的例子是持久性
module Persistence def load sFileName puts "load code to read #{sFileName} contents into my_data" end def save sFileName puts "Uber code to persist #{@my_data} to #{sFileName}" end end class BrandNewClass include Persistence attr :my_data def data=(someData) @my_data = someData end end b = BrandNewClass.new b.data = "My pwd" b.save "MyFile.secret" b.load "MyFile.secret"
想象一下,该模块是由Ruby忍者编写的,它将您的类的状态保存到文件中.
现在假设我写了一个全新的类,我可以通过混合来重用持久性的功能include ModuleILike
.您甚至可以在运行时包含模块.我只需将其混合即可免费加载并保存方法.这些方法就像您为自己的课程编写的方法一样.代码/行为/功能 - 没有继承的重用!
所以你正在做的是为你的类包含方法表的方法(不是字面上正确但接近).