多态

多态,就是说多种形态。

例如在之前的手机例子中,手机就拥有多种形态,一种形态能发短信,另一种形态不能发短信。但总的来说,它们都属于手机,它们都具备手机共有的功能:开机和打电话。

在代码中,我们可以把子类实例存放到父类类型的变量中,并且可以根据父类中的成员名称访问子类的成员:

var 某人的手机:手机 = 能发短信的手机.new()

某人的手机.打电话("10086")   
# 虽然 某人的手机 是手机类型,但其值是 能发短信的手机,所以调用的是 能发短信的手机 的打电话方法。

# 某人的手机.发短信("10086","Hello")
# 上面这句注释掉的代码是错误的。
# 虽然`能发短信的手机`能发短信,但是 某人的手机 是老手机类型,不包含发短信方法。

[!note]

能发短信的手机.new() 的意思是实例化一个能发短信的手机,就是创造一个能发短信的手机实例的意思。

例如我现在拥有三台手机:

var 手机们 := [
    手机.new(),
    能发短信的手机.new(),
    手机.new(),
]

这三台手机都存放在了数组中,现在我想给它们都开机:

for 手机之一 in 手机们:
    手机之一.开机()

在这段开机的遍历代码中,我们并不在乎手机是能发短信的手机还是老手机,我们只管调用它的开机方法即可,此时的 手机之一 变量就是具有多种形态的。

当然,使用多态的目的不是让我们的变量变得花里胡哨,而是规范一类操作,在刚才的例子中,我们就规范了所有手机的开机方式都应该使用 开机 方法,最终的作用就是实现了这一句话:不在乎手机是 能发短信的手机 还是老手机,我们只管调用它的开机方法