1 minute read

關於 Ruby 中的物件(Object)類別(Class)與實體(Instance)的學習筆記


photo by @maxcodes on Unsplash

前提:初學者的學習筆記,僅供參考,敬請指教~

物件導向是什麼?

Ruby 是一款物件導向程式語言

物件導向程式語言(Object Oriented Programming),簡稱 OOP。 是指使用「物件」(Object)來做設計,在物件導向的程式語言世界中,幾乎所有的一切都可以視為物件。

例如在 Ruby 世界裡,「幾乎」什麼都是物件(只有 Block 不是物件)。

那麼,所謂的物件是什麼呢?

物件(object) - 從類別(class)生出的實體(instance)


photo by 5xruby on 為你自己學 Ruby on Rails from photo by Bryan Liu on flickr
  • 物件 object
  • 類別 class
  • 實體/實例 instance

類別是一個比較抽象的概念,我們可以把類別當做「藍圖」或是「模具」,它是用來定義實體的。在實際的操作中,我們會將程式碼包裝成一個個類別,藉由類別所產生的物件,我們可以對物件的資料進行傳遞與處理。

在物件導向的程式語言中,物件(Object)是一個類別(Class)所製造出來的實體(instance)

  • 物件(object):由類別所產生。
  • 把類別(class)想像成模具,而物件(Object)就是由模具(class)所刻印出來的實體(instance)。

類別(class)

類別的命名規定 = 必須是常數(開頭大寫字母)

我們先定義一個類別 Cat,它有一個方法是 eat:

class Cat # 定義一個 class 叫做 Cat
  def eat(food) # 定義方法
    puts "#{food} 好好吃!!"
  end
end

我們來看看從類別生出的實體如何使用方法:

class Cat
  def eat(food)
    puts "#{food} 好好吃!!"
  end
end

kitty = Cat.new
# 透過 Cat.new 方法,生出 Kitty 物件
# kitty 是從類別(class)Cat 產出的實體(instance)

kitty.eat "魚"

# 印出:魚 好好吃!

實體(instance)

接著,我們來捋順這個例子裡實體與類別的關係:

Kitty 是 Cat 這個類別 (class)產生出的實體(instance)。

想像 Cat 是一個烤盤,定義了一個方法 eat ,烤好的雞蛋糕都可以使用 eat。我們透過 Cat.new 可以烤出多個雞蛋糕。kitty 是從 Cat 這個烤盤烤出來的雞蛋糕,所以它可以使用 eat 這個方法。

class Cat # 定義一個 class 叫做 Cat
  def eat(food) # 定義方法
    puts "#{food} 好好吃!!"
  end
end

kitty = Cat.new # kitty 是實體 ; Cat 是類別
kitty.eat "鮪⿂罐頭" #=> 印出「鮪⿂罐頭 好好吃!!」

nancy = Cat.new # nancy 是實體 ; Cat 是類別
nancy.eat "⼩魚餅干" #=> 印出「⼩小⿂餅干 好好吃!!」

繼承(inheritance)

類別之間,也可以繼承。但與其說是繼承,不如說是分類

繼承(inheritance):把共同的特徵放在同一個分類(class)

class 動物 # 有一個動物類別
end

class 靈長⽬ < 動物 # 靈長目類別繼承動物類別
  def 五指對握
  # do something
  end
end

class  < 靈長目 # 人類別繼承靈長目類別
end

從人類別生出的 me 還有 you,都繼承了靈長目類別的方法(五指對握)。

me = .new
you = .new

me.五指對握()
you.五指對握()

練習題

請建立一個小狗 Dog 類別及一個小貓 Cat 類別,並從都是繼承自動物 Animal 類別,而且都有實作走路 walk 及吃東西 eat 這兩個方法。

class Animal
  def walk
    # do something
  end

  def eat
    # do something
  end

end

class Dog < Animal
  end

class Cat < Animal
  end

#因為Cat和Dog都繼承了Animal,所以可以呼叫Animal的方法
kitty = Cat.new
kitty.walk
kitty.eat

lucky = Dog.new
lucky.walk
kitty.eat

參考資料: