iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 8
0
Modern Web

Ruby on Rails面試題挑戰系列 第 8

Ruby on Rails面試題挑戰 Day08 - 類別(Class)與模組(Module)的差異在哪裡?

What is the difference between a class and a module?
類別(Class)與模組(Module)的差異在哪裡?


第三天我們有提到物件中類別的概念,今日就來探討一下類別與另一個名詞模組之間的關係。

先簡單複習一下類別(Class)的概念,類別就像是建立物件的藍圖(blueprint),裡面定義了物件的狀態以及物件可以做的行為。而類別可以產生實體(Instance),也就是我們所說的物件。

而模組又是什麼呢?

模組跟類別其實很像,差別在於模組不能被繼承與產生實體。下面看看模組的寫法。

module Piano
  def play_piano
    puts "I can play the piano!"
  end
end

以module開頭,裡面定義play_piano方法。

class Human
  include Piano
end

John = Human.new
John.play_piano # => I can play the piano!

Human類別裡面我們並沒有定義play_piano方法,但藉由include Piano這個模組就可以使play_piano方法,John就因此學會彈鋼琴了!

其實Class類別是繼承自Module類別!在irb的模式中對類別使用superclass這個方法就可以找出它是繼承之哪一個類別。

Class.superclass # => Module

由下面這種方式,可以Class與Module的差別,類別方法並沒有不同,而差別在於allocate new superclass三個實體方法,new allocate與產生實體有關,而superclass 與繼承有關。
所以Module與Class最大的差別就在於,Module無法使用newallocate 產生實體,也沒有辦法繼承或被繼承別的類別或模組。

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

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

你可以這樣回答:

Class類別是繼承自Module類別,差別在於:

  1. 模組無法產生實體
  2. 模組無法繼承別的模組或類別

參考資料

  1. 為你自己學 Ruby on Rails_類別(Class)與模組(Module)
  2. Ruby Programming/Syntax/Classes

上一篇
Ruby on Rails面試題挑戰 Day07 - 請談談Ruby中的getter和setter
下一篇
Ruby on Rails面試題挑戰 Day09 - include與extend的差別在哪裡?
系列文
Ruby on Rails面試題挑戰30

尚未有邦友留言

立即登入留言