讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 14.8 多態和繼承 >

14.8 多態和繼承

接下來,我們來看對像最為重要的兩個方面:多態(polymorphism) 和繼承(inheritance)。這兩個詞很長很深奧,不過正是因為有這兩個方面,才使得對像如此有用。我會在下面幾節清楚地解釋它們的含義。

多態——同一個方法,不同的行為

非常簡單,多態是指對於不同的類,可以有同名的兩個(或多個)方法。取決於這些方法分別應用到哪個類,它們可以有不同的行為。

例如,假設你要建立一個程序做幾何題,需要計算不同形狀的面積,比如三角形和正方形。你可以創建兩個類,如下:

Triangle 類和 Square 類都有一個名為 getArea 的方法。所以,如果分別有這兩個類的實例,如下:

>>> myTriangle = Triangle(4, 5)>>> mySquare = Square(7)  

就可以使用 getArea 分別計算它們的面積:

>>> myTriangle.getArea10.0>>> mySquare.getArea49  

這兩個形狀都使用了方法名 getArea,不過每個形狀中這個方法做的工作不同。這就是一個多態的例子。

繼承——向父母學習

在真實的(非編程)世界中,人們可以從他們的父母或者其他親戚那裡繼承一些東西。你可以繼承一些特徵,比如說紅頭髮,或者可以繼承像錢和財產之類的東西。

在面向對像編程中,類可以從其他類繼承屬性和方法。這樣就有了類的整個「家族」,這個「家族」中的每個類共享相同的屬性和方法。這樣一來,每次向「家族」增加新成員時就不必從頭開始。

從其他類繼承屬性或方法的類稱為派生類(derived class)或子類(subclass)。可以舉一個例子來解釋這個概念。

假想我們要建立一個遊戲,玩家一路上可以撿起不同的東西,比如食物、錢或衣服。可以建一個類,名為 GameObjectGameObject 類有 name 等屬性(例如 coin、apple 或 hat)和 pickUp 等方法(它會把硬幣增加到玩家的物品集合中)。所有遊戲對象都有這些共同的方法和屬性。

然後,可以為硬幣建立一個子類。Coin 類從 GameObject 派生。它要繼承 GameObject 的屬性和方法,所以 Coin 類會自動有一個 name 屬性和 pickUp 方法。Coin 類還需要一個 value 屬性(這個硬幣價值多少)和一個 spend 方法(可以用這個硬幣去買東西)。

下面來看這些類的代碼: