关于class和module
module的概念和使用场景
module适用于作为命名空间
用module来实现类的多重继承(mixin)
作为工具模块
作为工具模块,放通用方法,别的类里面直接include或者extend以后使用,也可以看成动态扩展业务类.module比较关注的是功能方面,它把方法收集在一起,组成一个特殊的上下文,通常表示一种能力.对module来说很难是逻辑完整的,因为module只能描述一个特殊的上下文,而这个上下文通常无法组成一个完整的对象,需要被找一个宿主,而这个宿主有可能是class,也有可能是module.也可以作为抽象类,module里面提供默认实现,业务类include或者extend以后覆盖.
class的概念和使用场景
类可以实例化
class就是我们所理解的经典的类,它是逻辑完整的,甚至能在现实世界中找到对应物,可以创建实例对象,包含实例变量和类变量,一般通过对象来与外界交流。
类的继承
类使用<作为继承的关键字,只支持单继承
module Space # 用作命名空间
module A
class B
end
end
class C
end
end
#######
module Cognize
def read
puts 'module read'
end
def write
puts 'module write'
end
end
class User
include Cognize
def read
puts 'user read'
end
end
u = User.new
u.read # 'user read'
u.write # 'module write' 继承了module里的write方法
########
require 'active_support'
module Member
## 此处的写法有多种,active_support提供了concern 的机制会自动
## include InstanceMethod 和 extend ClassMethod
extend ActiveSupport::Concern
## 也可以 手动include InstanceMethod 和 extend ClassMethod
include InstanceMethod
extend ClassMethod
module InstanceMethod
def module_instance
puts 'module instance'
end
end
module ClassMethod
def module_collection
puts 'module collection'
end
end
end
class User
include Member
end
User.module_collection # 'module collection'
u = User.new
u.module_instance # 'module instance'
总结
class和module的最大区别是,class可以实例化,module不可以.module更像是抽出的一块能力工具.
class可以继承,单继承于某个类,但是可以include多个module来'多重继承'.
在使用时除了命名空间外先使用class来写,后续如果有相似代码的提取的需要就引入module
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。