iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
1
自我挑戰組

關於 Ruby on Rails 的那些事系列 第 7

Day 7 - 想要會飛就得當小鳥的孩子嗎?

Class 類別

中文翻譯為類別,什麼是類別呢?
以生活中的例子來說,人是一個類別,車是一個類別,但類別是一個很抽象的詞。
就人來說,具有一顆頭、兩隻手、兩隻腳、會跑會跳會說話,再具體化一點,你、我就是「人」這個類別的實體,你有一顆頭與四肢,我也有這些特徵。除了人類之外還有狗、鳥、昆蟲等,這些我們統稱為動物,其特徵是會呼吸,就像生物分類法(界、門、綱、目、科、屬、種)的概念。所以可以在動物這個類別定義一個方法是呼吸,而後的人、狗、鳥等等透過繼承動物的呼吸方法,人、狗、鳥都會呼吸了,這樣的好處是不必在定義人、狗、鳥時重複寫呼吸的方法,只要針對這些類別不同之處去寫特定的方法就可以,像是人會說話、狗會吠叫、鳥會飛。

換成車子呢,一個引擎、四顆輪子、會跑,具體的例子可以是 Ferrari 跑車、Jeep 越野車、Lexus 休旅車,這些有共同的狀態和行為。除了車子,還有飛機、船、腳踏車等等交通工具,交通工具的最大特點就是會移動,所以我們先來定義交通工具這個類別:
※小提醒:定義類別要使用常數 ( 首字為大寫字母 )。

class Transportation
  def move
    puts "Moving!"
  end
end

然後車子、飛機等繼承自交通工具,所以也得到move這個方法:

class Car < Transportation
end
 
class Airplane < Transportation
end
  
class Boat < Transportation
end

接下來先定義車這個類別,可以帶入品牌和類型兩個參數,並且用new這個方法產生實體。
假設小明買了一台黑色的lexus休旅車,並將愛車取名為大黑。買車後就要上路啦,呼叫run方法,讓車子動起來!

class Car < Transportation
  def initialize(brand, type)
    @brand = brand
    @type = type
  end

  def run(name)
    puts "#{name} is running on the road"
  end
end

my_car = Car.new("posh", "sportcar")
my_car.run('大黑')
# 印出 大黑 is running on the road.

有車還是不能滿足小明的慾望,覺得車子只會在路上跑很無趣,望向天空,有一架飛機飛過頭頂,小明有個大膽的想法,希望大黑可以像飛機一樣在天上飛,於是用繼承的方式讓大黑也可以飛起來:

class Airplane
  def fly(name)
    puts "#{name} is flying in the sky."
  end
end
airbus = Airplane.new
airbus.fly('榮榮1380')
# 印出 榮榮1380 is flying in the sky.

class Car < Airplan
  # 略...
end
my_car.fly('大黑')
# 印出 大黑 is flying in the sky.

看到這裡不會覺得很奇怪嗎?小明為了讓車子飛起來就繼承飛機的功能,就像狗狗為了想要飛,就去當小鳥的孩子一樣,這樣是不對的,所以接下來要講 Module 的精隨。

Module 模組

如果把 class 比喻成用樂高疊出來的物件,那 Module 就像是積木,一塊塊積木代表著 method,需要的人可以拿去組在自己的本體上。這樣就不用為了功能而去當別人的小孩。
首先把fly功能拿出來寫成一個積木,這塊積木就取名為Flyable:
※小提醒:定義模組跟類別一樣要使用常數 ( 首字為大寫字母 )。

module Flyable
  def fly(name)
    puts "#{name} can fly!"
  end
end

如果車子也想會飛 (也許未來每個人真的都有一台榮恩家的車) ,那車子這個類別就可以把飛行的積木拿去組在自己身上,組裝的方式是用include

class Car
  include Flyable
  def run(name)
    puts "#{name} is running on the road."
  end
end

現在讓車子跑起來、也飛起來吧~

my_car = Car.new
my_car.run('大黑')
my_car.fly('大黑')

# 執行結果
# 大黑 is running on the road.
# 大黑 can fly!

參考資料:
為你自己學Ruby on Rails

學無止盡,每天都要進步一點點!


上一篇
Day 6 - Hash的key比較適合用Symbol?
下一篇
Day 8 - 程式碼區塊 Block 「Lambda」 and 「Proc」
系列文
關於 Ruby on Rails 的那些事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言