接下来,我们来看对象最为重要的两个方面:多态(polymorphism) 和继承(inheritance)。这两个词很长很深奥,不过正是因为有这两个方面,才使得对象如此有用。我会在下面几节清楚地解释它们的含义。
多态——同一个方法,不同的行为
非常简单,多态是指对于不同的类,可以有同名的两个(或多个)方法。取决于这些方法分别应用到哪个类,它们可以有不同的行为。
例如,假设你要建立一个程序做几何题,需要计算不同形状的面积,比如三角形和正方形。你可以创建两个类,如下:
Triangle
类和 Square
类都有一个名为 getArea
的方法。所以,如果分别有这两个类的实例,如下:
>>> myTriangle = Triangle(4, 5)>>> mySquare = Square(7)
就可以使用 getArea
分别计算它们的面积:
>>> myTriangle.getArea10.0>>> mySquare.getArea49
这两个形状都使用了方法名 getArea
,不过每个形状中这个方法做的工作不同。这就是一个多态的例子。
继承——向父母学习
在真实的(非编程)世界中,人们可以从他们的父母或者其他亲戚那里继承一些东西。你可以继承一些特征,比如说红头发,或者可以继承像钱和财产之类的东西。
在面向对象编程中,类可以从其他类继承属性和方法。这样就有了类的整个“家族”,这个“家族”中的每个类共享相同的属性和方法。这样一来,每次向“家族”增加新成员时就不必从头开始。
从其他类继承属性或方法的类称为派生类(derived class)或子类(subclass)。可以举一个例子来解释这个概念。
假想我们要建立一个游戏,玩家一路上可以捡起不同的东西,比如食物、钱或衣服。可以建一个类,名为 GameObject
。GameObject
类有 name
等属性(例如 coin、apple 或 hat)和 pickUp
等方法(它会把硬币增加到玩家的物品集合中)。所有游戏对象都有这些共同的方法和属性。
然后,可以为硬币建立一个子类。Coin
类从 GameObject
派生。它要继承 GameObject
的属性和方法,所以 Coin
类会自动有一个 name
属性和 pickUp
方法。Coin
类还需要一个 value
属性(这个硬币价值多少)和一个 spend
方法(可以用这个硬币去买东西)。
下面来看这些类的代码: