多态
多态,就是说多种形态。
例如在之前的手机例子中,手机就拥有多种形态,一种形态能发短信,另一种形态不能发短信。但总的来说,它们都属于手机,它们都具备手机共有的功能:开机和打电话。
在代码中,我们可以把子类实例存放到父类类型的变量中,并且可以根据父类中的成员名称访问子类的成员:
var 某人的手机:手机 = 能发短信的手机.new()
某人的手机.打电话("10086")
# 虽然 某人的手机 是手机类型,但其值是 能发短信的手机,所以调用的是 能发短信的手机 的打电话方法。
# 某人的手机.发短信("10086","Hello")
# 上面这句注释掉的代码是错误的。
# 虽然`能发短信的手机`能发短信,但是 某人的手机 是老手机类型,不包含发短信方法。
[!note]
能发短信的手机.new()
的意思是实例化一个能发短信的手机
,就是创造一个能发短信的手机
实例的意思。
例如我现在拥有三台手机:
var 手机们 := [
手机.new(),
能发短信的手机.new(),
手机.new(),
]
这三台手机都存放在了数组中,现在我想给它们都开机:
for 手机之一 in 手机们:
手机之一.开机()
在这段开机的遍历代码中,我们并不在乎手机是能发短信的手机
还是老手机,我们只管调用它的开机方法即可,此时的 手机之一
变量就是具有多种形态的。
当然,使用多态的目的不是让我们的变量变得花里胡哨,而是规范一类操作,在刚才的例子中,我们就规范了所有手机的开机方式都应该使用 开机
方法,最终的作用就是实现了这一句话:不在乎手机是 能发短信的手机 还是老手机,我们只管调用它的开机方法。