iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
0
Software Development

Ruby 研究 30 天系列 第 10

Day 9 - Class - 物件導向

OOP

有非常多的文章在介紹 Ruby 時,會提到 Ruby 是一款物件化非常徹底程式語言,來看看OOP的定義:

物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有物件概念的程式編程典範,同時也是一種程式開發的抽象方針。它可能包含資料、屬性、程式碼與方法。物件則指的是類別的實體。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性,物件裡的程式可以存取及經常修改物件相關連的資料。在物件導向程式編程裡,電腦程式會被設計成彼此相關的物件。

Class

在 Ruby 中 class 也一樣是個物件,如何用 Object Model 來實踐物件導向?

從 OOP 的來看,一個類別( class )定義了一件事物的抽象特點,其中包含了資料的形式以及對資料的操作。

物件導向是模擬現實生活中物件的一種程式抽象化概念。假設現實世界中每個物件都有他的狀態(state)以及行為(behavior),而對照到程式的物件導向中就會變成實體變數(instance variable)和方法(method)。 - 參考文章出處

1.用 class 定義方法給實體用,然後印出實體instance ,該實體便具備那些抽象特點,也就是使用哪些定義的方法:

定義「狗」,行為:「吠叫、吃與走路」,假設我有一隻哈士奇,牠會吃飯與吠叫。

class Dog
  def bark
    puts " 汪汪~ "
  end
  def eat
    puts " 好吃好吃! "
  end
end

husky = Dog.new
husky.bark     # 印出 汪汪~
husky.eat      # 印出 好吃好吃!
  1. 在物件導向的概念裡,如果這些類別的用途是同一型的,通常會把相同功能的方法移到「上一層」的類別裡,然後再去繼承它:
class Animal
end

class Dog < Animal  # 繼承 Animal
end

husky = Dog.new

簡單的說類別就像模子,本身不直接拿來使用的,用模子印出的實體化成物件( object ),才被拿來「使用」。

object.calss             # 印出 Class
Class.class              # 印出 Class

Object.superclass        # 印出 BasicObject
Class.superclass         # 印出 Module.class

BasicObject.class        # 印出 Class
BasicObject.superclass   # 印出 nil

Module.class             # 印出 Class
Module.superclass        # 印出 Object

https://ithelp.ithome.com.tw/upload/images/20191122/20120823XCpFzLSu2K.png

最後來做個的小實驗,用 .instance_methods可叫出該 class 具備的 instance method,以此來驗證一下將 class 作為實體的寫法是否行得通

Dog = Class.new do
  def bark
    puts " 汪汪~ "
  end
end

class Dog
  def eat
    puts " 好吃好吃! "
  end
end

Dog.instance_methods - Object.instance_methods    # 印出 [:bark, :eat]

上例可以推測出兩種宣告 class 的方法是等效的,差別在於使用 new 方法時,必須將 block 掛上,如此才可以把 method傳進該class 裡。

此文同步刊登於CJ-Han的網站


上一篇
Day8 - 邏輯運算子
下一篇
Day 10 - Ruby 裡的非物件
系列文
Ruby 研究 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言