淺談ruby語言中的一些概念(class和module)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM