類別之間的關係
在物件導向程式設計(OOP)中,類別(class)之間的關係可以分為以下幾種類型:
1. 繼承關係(Inheritance)
- 描述:子類別繼承父類別的屬性和方法,並可以擴展或重寫這些方法。
- 用途:表示「is-a」關係,子類別是一種父類別的特殊化。
- 範例:
1
2
3
4
5
6
7class Animal:
def speak(self):
print("Animal speaks")
class Dog(Animal): # Dog 繼承自 Animal
def speak(self):
print("Dog barks")
2. 組合關係(Composition)
- 描述:一個類別包含另一個類別的實例,形成「has-a」關係。
- 用途:用於表示部分-整體或擁有關係。
- 範例:
1
2
3
4
5
6
7
8
9
10
11class Engine:
def start(self):
print("Engine starts")
class Car:
def __init__(self):
self.engine = Engine() # Car 擁有一個 Engine 實例
def drive(self):
self.engine.start()
print("Car is driving")
3. 關聯關係(Association)
- 描述:一個類別和另一個類別之間有某種業務邏輯上的聯繫,但並不擁有對方的實例。
- 用途:表示「使用」或「合作」的關係。
- 範例:
1
2
3
4
5
6
7class Driver:
def drive(self, car):
car.drive()
class Car:
def drive(self):
print("Car is being driven")
4. 聚合關係(Aggregation)
- 描述:一個類別包含另一個類別的實例,但兩者是弱依賴的關係,子物件的生命周期獨立於父物件。
- 用途:表示「部分-整體」的關係,但部分可以獨立存在。
- 範例:
1
2
3
4
5
6
7
8
9
10
11class Wheel:
def rotate(self):
print("Wheel rotates")
class Car:
def __init__(self, wheels):
self.wheels = wheels # Car 擁有 Wheels,但 Wheels 可以獨立存在
def drive(self):
for wheel in self.wheels:
wheel.rotate()
5. 依賴關係(Dependency)
- 描述:一個類別暫時依賴於另一個類別的功能,但不是永久的關聯。
- 用途:通常用於方法或函數中的參數傳遞。
- 範例:
1
2
3
4
5
6
7class Printer:
def print_document(self, document):
print(f"Printing: {document}")
class User:
def use_printer(self, printer):
printer.print_document("MyDocument.pdf")
額外說明
- 這些關係可以搭配使用,例如繼承 + 組合的模式經常出現在大型系統中。
- 適當選擇關係有助於提升程式的可讀性、可重用性和維護性。
參考:
https://realpython.com/inheritance-composition-python/
Association,Aggregation,Composition and Inheritance的差異
https://itexpertsconsultant.wordpress.com/tag/class-diagram/
UML關係圖
https://www.visual-paradigm.com/guide/uml-unified-modeling-language/uml-class-diagram-tutorial/
https://www.umlboard.com/docs/relations/