上一章介紹完類別了,今天來介紹跟他有點像的東西,模組!
現在我有一個未來人類別,而我想要這個未來人類別有飛行功能,你可能會這樣做:
雖然這兩種可行,但第 1 種的設計有點奇怪,為什麼要為了有飛行功能就跑去當機器。
第 2 種好像可以,但之後又有不同類別也想要飛行功能,這樣又要在該類別寫飛行功能,飛行功能就不能共用了。
這時,模組就可以用了!
我們可以用 module
來建立一個模組:
module Flyable
def fly
puts "I can fly!"
end
end
在命名上跟類別一樣,都是使用駝峰式命名。
但要怎麼用呢?
我們只要用 include
就行了:
class FutureMan
include Flyable
end
man = FutureMan.new
man.fly
當我把飛型模組裝上去後,未來人就會飛了,那如果機器人也想飛的話,只要再加一行:
class Robot
include Flyable
end
robot = Robot.new
robot.fly
這樣機器人就會飛了!
類別是繼承過來了,模組是額外裝上去的。
在 Ruby 裡,類別的上層類別就是模組
開個 irb
來看看:
$ irb
>> Class.superclass
=> Module
這邊我們透過 superclass 可以看到 Class 的上層就是 Module。
由此可知類別跟模組之間是繼承關係,那他們的差別:
$ irb
>> Class.instance_methods - Module.instance_methods
=> [:allocate, :superclass, :subclasses, :new]
這邊可以看到下層 Class 類別,比 Module 類別多了 4 種方法,所以它跟 Class 最大的差別:
new
一個新的實體出來。當你發現你要做的這個功能,它可能在很多不同類別裡都會用得到,那就可以考慮把功能寫在模組裡,需要的時候再 include 進來。
參考資料: