iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 7
1

類別與模組關係

記得上課時時候提到類別與模組,他們兩個乍看之下很像,但實際上是有很大的差別,我們利用superclass來比一比,Class.superclass將會得到Module這個結果,說明了它其實就是模組延伸出來的,簡單來說「類別」就是「模組」的後代。

> Class.superclass  # => Module
> Module.superclass  # => Object

兩者差異

除了定義的方式不同,其他差異可以先利用類別方法方法來看,得到了[]陣列,表是其實在發法上兩者並無差異

> Class.methods - Module.methods  # => [

再來我們用實體方法來看

> Class.instance_methods - Module.instance_methods
  # => [:allocate, :superclass, :new]

得到了[:allocate, :superclass, :new]這幾種結果,其中allocate跟new跟產生實體有關,所以得知模組不可以做出實體物件;superclass則與繼承有關,所以模組也不能繼承任何東西。可以得知一個觀念「 類別可以繼承,但是模組不行 」。

  • 補充 allocate:
    allocate 跟 new 一樣能夠做出實體物件,但是唯一不同的是,它不會調用類別中 initialize 方法。

用途上的差別

按照龍哥所提到的例子:如果我有一個小貓類別,我希望這個小貓會飛,你會怎麼做?
小貓會飛在現實中很瘋狂啊,但程式裡就是能夠做到,列出例子來看:

module Flyable
  def fly
    puts "I can fly!"
  end
end

class Cat
  include Flyable
end

kitty = Cat.new
kitty.fly        # => I can fly!

哇~在這裡貓真得會飛欸!
再來看看舉其他例子,假設小孩有位富爸爸,小孩因為include爸爸也得到了這些資產及天賦。
父層模組老爸認命打拼,子層類別根本富二代能直接繼承家產家業啊!真好 (誤

module Father
  def rich
    puts "I am rich!"
  end
  def deserve
    puts "I deserve it!"
  end
  def good
    puts "I am good!"
  end
  def healthy
    puts "I am healthy!"
  end
  def successful
    puts "I am successful!"
  end
end

class Child
  include Father
end

child = Child.new 
child.rich         # => I am rich!
child.deserve      # => I deserve it!
child.good         # => I am good!
child.healthy      # => I am healthy!
child.successful   # => I am successful!

「我富有、我值得、我善良,健康又成功」(這段話出自我很富有
假設家庭成員多了一位新成員Baby,一樣可以include去直接得到富爸爸的所有資產及天賦喔!

class Baby
  include Father
end

結論:有富爸爸可以少奮鬥30年呀~~(疑?

連結參考:
Ruby 語法放大鏡之「類別跟模組有什麼不一樣?」


上一篇
Day06 | 轉轉轉迴圈與迭代
下一篇
Day08 | 模組 include v.s extend
系列文
從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發!30

尚未有邦友留言

立即登入留言