關於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
