繼承

當你試著解決一些程式設計的問題時,通常會發現有一個「既有的類別所建立的物件」已經大致滿足你的需求了。 你可以做什麼?

【解決方案一】

可以修改這個舊類別

  • 缺點
    • 這種做法會讓它變得更複雜
    • 也有可能會破壞原本可以正常動作的功能

【解決方案二】

寫一個新類別(剪下舊的,貼到新的,合併到你的新程式)

  • 缺點
    • 代表需要維護更多程式
    • 而且動作曾經一致的舊程式與新類別可能會漸行漸遠,因為現在它們分屬不同的程式段落

【解決方案三】

  • 解決之道:使用繼承
    • 使用「既有的類別」來建立一個「新的類別」,但加入一些新的東西,或修改它
    • 這是一種很棒的程式重複使用方式
    • 使用繼承時,「新類別」可以自動使用「舊類別的所有程式」,但不需要複製任何舊程式
    • 可以只在新類別定義想要添加或改變的東西 → 它們會覆寫舊類別的行為
  • 類別名稱
    • 原本的類別稱為:父系(parent)、超類別(superclass)或基礎類別(base class)
    • 新類別稱為:子系(child)、子類別(subclass)或衍生類別(derived class)
    • 在物件導向程式設計中,這些名詞是可以互換的

【範例一】繼承

  1. 定義一個空類別
  2. 定義一個子類別 → 定義子類別一樣使用「class 關鍵字」,但要在括號內加上「父類別的名稱」
  3. 接下來,分別用每一個類別來建立一個物件
>>> class 空類別/父類別名稱():
        pass

>>> class 子類別名稱(父類別名稱):
        pass

>>> 文字1 = 父類別名稱()
>>> 文字2 = 子類別名稱()
# 定義一個空類別,稱為 Car
>>> class Car():
        pass

# 定義一個 Car 的子類別,稱為 Yugo
# 定義子類別一樣使用 class 關鍵字,但是要在括號內加上父類別的名稱(下列的 class Yugo(Car) )
>>> class Yugo(Car):
        pass

>>> give_me_a_car = Car()
>>> give_me_a_yugo = Yugo()   # 名為 give_me_a_yugo 的物件是 Yugo 類別的一個特例,但它也繼承 Car 可做的所有事情

【範例二】繼承

  • 子類別是父類別的特例,在物件導向術語中,Yugo is-a Car
  • 名為 give_me_a_yugo 的物件是 Yugo 類別的一個特例,但它也繼承 Car 可做的所有事情
  • 在這個例子中,Car 與 Yugo 不能拿來做什麼事情,所以我們來定義會做些事情的新類別:
>>> class 父類別名稱():
        def 函式名稱(self):
            print("字串")

>>> class 子類別名稱(父類別名稱):
        pass

>>> 物件名稱1 = 父類別名稱()
>>> 物件名稱2 = 子類別名稱()
>>> 物件名稱1.函式名稱()
文字
>>> 物件名稱2.函式名稱()
文字
>>> class Car():
    def exclaim(self):
        print("I'm a Car!")

>>> class Yugo(Car):
    pass

# 製作每個類別的物件,並呼叫 exclaim 方法
>>> give_me_a_car = Car()
>>> give_me_a_yugo = Yugo()
>>> give_me_a_car.exclaim()
I'm a Car!

# 在沒有做任何特殊事情的情況下,Yugo 會從 Car 繼承 exclaim() 方法
# 事實上 Yugo 說它是一輛 Car 很可能會導致身分認同危機
>>> give_me_a_yugo.exclaim()
I'm a Car!
  • 在沒有做任何特殊事情的情況下,Yugo 會從 Car 繼承 exclaim() 方法
  • 事實上 Yugo 說它是一輛 Car 很可能會導致身分認同危機。我們來看一下可以做些什麼

results matching ""

    No results matching ""