指的是將一個物件的狀態(屬性或資料)和行為(方法或函式)包裝在一個單一的單位中,並且限制外部程式碼對這個單位內部的直接訪問。封裝的目標是隱藏物件的內部實現細節,同時提供一個公共介面供其他程式碼與之互動。
簡單才說就是把內部的實作內容隱藏起來,讓使用者只需要知道怎麼呼叫這個方法即可。
屬性和方法的組合:
資料隱藏:
公共方法:
訪問控制:
public
, private
, protected
控制訪問權public
方法:
private
方法:
private
關鍵字聲明的方法只能在類的內部使用,外部程式碼無法訪問它們。protected
方法:
protected
關鍵字聲明的方法在類的內部和子類中可以訪問,但在類的外部不能被訪問。class MyClass
def public_method
puts "This is a public method"
end
private
def private_method
puts "This is a private method"
end
protected
def protected_method
puts "This is a protected method"
end
end
class MySubClass < MyClass
def access_methods
public_method # 可以訪問父類別的公開方法
protected_method # 可以訪問父類別的受保護方法
# private_method # 不能訪問父類別的私有方法,這會引發錯誤
end
end
obj = MyClass.new
obj.public_method # 可以從外部訪問公開方法
# obj.protected_method # 不能從外部訪問受保護方法,這會引發錯誤
# obj.private_method # 不能從外部訪問私有方法,這會引發錯誤
sub_obj = MySubClass.new
sub_obj.access_methods # 子類可以訪問父類的公開和受保護方法
允許一個類別(子類別)繼承另一個類別(父類別)的屬性和方法。這個概念有助於建立層次結構的類別,促使代碼重用和結構化。
<
符號來建立繼承關係。子類別可以通過繼承父類別來獲得父類別的方法和屬性。super
關鍵字來調用父類別的同名方法。這允許在子類別中擴展父類別的行為而不完全覆寫它。class Animal
def speak
"Some sound"
end
end
class Dog < Animal
def speak
"Woof!"
end
end
class Cat < Animal
def speak
"Meow!"
end
end
Animal
是父類別,Dog
和 Cat
是子類別。它們都繼承了 Animal
的 speak
方法,但覆寫了它以提供不同的實現。當我們創建 Dog
或 Cat
的實例並呼叫 speak
方法時,將分別返回 "Woof!" 和 "Meow!"。
它允許不同類別的物件對相同的消息(方法)做出不同的回應。這樣的概念使我們可以使用通用的介面來操作不同類型的物件,使程式碼更具靈活性和可擴展性。在 Ruby 中,多型通常實現為方法名稱相同,但不同類別的物件具有不同的實現。
抽象類別(Abstract Class)是實現多型的一種方式,雖然 Ruby 沒有嚴格的抽象類別機制,但我們可以透過特定的方式來實現類似的功能。
class Animal
def speak
raise NotImplementedError, "子類別必須實作這個方法"
end
end
class Cat < Animal
def speak
"Meow!"
end
end
class Dog < Animal
def speak
"Woof!"
end
end
Animal
是一個抽象類別,它定義了一個虛擬的 speak
方法。Cat
和 Dog
子類別都繼承了 Animal
,並覆寫了 speak
方法以提供自己的實現。如果有其他子類別未實作 speak
方法,則會引發 NotImplementedError
。