物件導向的特色

物件導向的特色

常常聽到別人說物件導向、物件導向,一直以來都搞不懂,而且在實作的時候不容易察覺到
今天就來介紹物件導向的幾個特色

  • 封裝(Encapsulation)
  • 繼承(Inheriitance)
  • 多型(Polymorphism)

封裝(Encapsulation)

封裝是,只公開必要的介面,強迫外部的使用者只能透過介面做溝通,隱藏內部的資料或是邏輯,
無法干涉也無法看見內部的細節,而不需要了解物件內部是怎麼運作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Cat
#initialize可以定義類別屬性
def initialize(name)
@name = name
end

#定義一個類別方法,公開的方法,發出聲音的方法,是貓的行為
def sound
"meow meow"
end
end

#產生一個貓的物件,名字是Lily
cat1 = Cat.new("Lily")

#呼叫公開的方法
puts cat1.sound

貓的類別裡面
有貓的屬性
有一個貓的公開方法sound
封裝就是把屬性和方法包裝在一個單元裡面,外部可以透過物件來呼叫這個方法,讓貓發出聲音,但是外部的使用者不知道貓是如何發出的

繼承(Inheriitance)

允許子類別(subclass)可以繼承另一個父類別(superclass),去繼承父類別的屬性和方法。
重複性的類別在父類別上定義,子類別就可以做細節的屬性以及方法,這樣有益於代碼重用和建立結構化的層級。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Animal
def sound
puts "Animals can produce sounds"
end
end

class Cat < Animal
def speak
puts "cat meow meow"
end
end

cat2 = Cat.new
cat2.speak # cat meow meow

多型(Polymorphism)

意思是名稱完全相同的方法,但是根據傳入不同的參數,而有執行不同的動作

  1. 多載(Overloading)

  2. 複寫(Overriding)

以複寫作為範例(使用ruby on rails)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Animal
def sound
"Animals can produce sounds"
end
end

class Dog < Animal
def sound
"Dog howl howl"
end
end

class Cat < Animal
def sound
"Cat meow meow"
end
end

class Pig < Animal
def sound
"Pig oink oink"
end
end

# 建立動物的陣列
animals = [Dog.new, Cat.new, Pig.new]

# 讓每種動物發出聲音
animals.each do |animal|
puts animal.sound
end

建立了一個父類別Animal類別,讓Dog、Cat、Pig都繼承這個父類別
接下來,在各個子類別複寫sound方法,更細部描述每種動物的聲音
最後產生一個陣列包含不同動物的物件,使用迴圈讓每個動物發出聲音
不同類別的物件可以呼叫相同的方法sound,但根據物件的實際類別而執行不同的動作