今天我們要來介紹一下多型的觀念,我們可以利用這個方式寫一個 BaseCollection 物件,搭配 Pydantic 來進行類似 ORM 的操作,方便我們取用 MongoDB 的資料,今天我們先針對多型的觀念來做介紹
多型是面向對象程式設計(OOP)中的一個重要概念,它允許不同的物件對相同的方法名稱進行不同的實現。多型意味著相同的接口可以有不同的實現方式,這提高了程式的靈活性和可擴展性。以下是多型的簡介:
方法重載(Method Overloading):多型的一種形式是方法重載,它允許在同一個類別中定義具有相同名稱但不同參數的方法。根據方法的參數列表,選擇合適的方法進行調用。
方法覆寫(Method Overriding):另一種多型的形式是方法覆寫,它發生在繼承關係中。子類別可以覆寫父類別的方法,以提供自己的實現。當呼叫方法時,將調用子類別的實現。
抽象類別與介面(Abstract Classes and Interfaces):多型的一種常見應用是抽象類別和介面。抽象類別可以包含一些方法的實作,但也可以有一些未實作的抽象方法,這些方法需要在派生類別中實作。介面是一種純抽象的定義,它只包含方法的簽名,具體實作由實現該介面的類別提供。
運算符多載(Operator Overloading):某些程式語言允許使用者自定義運算符的行為,這種概念稱為運算符多載。這意味著您可以為不同的類別定義相同的運算符,但其行為可以不同。
動態繫結(Dynamic Binding):多型的一個重要特性是動態繫結。這表示在運行時,根據物件的實際型別來決定要調用哪個方法實作。這提供了更大的靈活性,因為您可以在不修改程式碼的情況下替換不同的物件。
多型性質(Polymorphic Properties):多型使得程式碼更容易理解和維護,因為它允許使用者關注接口而不是特定的實現細節。這有助於實現程式碼的模組化和重用性。
總之,多型是面向對象程式設計的核心概念之一,它允許不同的物件以相同的方式互動,同時具有不同的實現方式。這提高了程式碼的可擴展性、維護性和可讀性。
當您使用 "Base" 或基底類別時,多型(polymorphism)是一個自然的結果,因為派生類別可以覆寫基底類別的方法,並以自己的方式實現這些方法。以下是一個簡單的 Python 多型範例,使用基底類別:
# 定義基底類別 Animal
class Animal:
def speak(self):
pass
# 派生類別 Dog
class Dog(Animal):
def speak(self):
return "汪汪汪!"
# 派生類別 Cat
class Cat(Animal):
def speak(self):
return "喵喵喵!"
# 使用多型
def animal_sound(animal):
return animal.speak()
# 創建不同的動物實例
dog = Dog()
cat = Cat()
# 使用多型呼叫 speak 方法,具體實現取決於動物的類型
print(animal_sound(dog)) # 輸出:汪汪汪!
print(animal_sound(cat)) # 輸出:喵喵喵!
在這個例子中,Animal
是基底類別,它定義了一個方法 speak
。然後,Dog
和 Cat
是派生類別,它們覆寫了 speak
方法以返回不同的聲音。透過 animal_sound
函式,我們可以以相同的方式呼叫 speak
方法,但具體的實現取決於動物的類型,這就是多型的體現。
這個範例展示了如何使用基底類別和派生類別實現多型,這是物件導向程式設計的一個重要概念,它允許不同的物件對相同的方法呼叫進行不同的實現。