4. 走路像鴨子、叫聲像鴨子,他就是鴨子?

2023年12月27日

💎 加入 E+ 成長計畫 與超過 350+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

走路像鴨子、叫聲像鴨子,他就是鴨子? 在程式語言的類型中,有兩種類型可以拉出來討論:

  • Nominal Typing (名義化類型) 專注於類型的名稱、而非結構,舉例來說:
class Bird:
 def fly(self):
  return "I can fly!"
class Sparrow(Bird):
 pass
def let_it_fly(bird: Bird):
 return bird.fly()
sparrow = Sparrow()
print(let_it_fly(sparrow))

此處的 sparrow 被當作是 Bird,因為他繼承了 Bird

  • Structure Typing (結構化類型) 更在乎是否有相同的方法和屬性,舉例來說:
class Bird:
 def fly(self):
  return "I can fly!"
class Airplane:
 def fly(self):
  return "Flying high in the sky!"
def let_it_fly(thing):
 return thing.fly()
bird = Bird()
print(let_it_fly(bird))
# 輸出 I can fly!
airplane = Airplane()
print(let_it_fly(airplane))

輸出 Flying high in the sky!

結構化型別又稱為鴨子型別 (Duck Typing),因為他只在乎結構是否相同,就如同開頭說的,「只要他叫聲像鴨子、走路像鴨子,那他就是鴨子」,這樣的好處在於:

  1. 靈活性:不必擔心物件的具體類型,僅依據他的方法和屬性決定,不依靠繼承或類的實現。
  2. 易於理解:通常你只會關注可以做什麼,而非他是什麼,在大型專案中可以減少維護類型層次的複雜性。
  3. 提高程式碼的重用性:可以讓有相同方法和屬性的物件共享程式碼。
🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們